Daha önce aynı soruyu sormuştum. Bunu hesaplayabilen bir kod yazabildim ancak bu kod satırlarını bir stratejiye adapte edemedim.
(Tek indikatörlü bir stratejide kalıcı giriş sinyali oluşup emir verildikten sonraki an ile kalıcı çıkış sinyali oluşup pozisyondan çıkılan an arasında kalan bölgelerde oluşan en yüksek ve en düşük değerleri nasıl çekebilirim?
Amacım her oluşan AL-SAT ve SAT-AL bölgesi için bu değerlerin, giriş fiyatından farklarını bulmak.
Ör: Pmax fiyatı aşağı kırdığında oluşan emir barı ile yukarı kırdığında oluşan emir barı arasında kalan barlarda ki max. ve min. )
Amacım bu işlemlere CurrentIndex'ten X adet bar önce başlasın ve CurrentIndex-1 de bitirsin. ve elde edilen SON ortalama değerler ile Kar Al ve Zarar Durdur belirlenebilsin.
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.AI;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.AlgoTrader;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Trader.Core.TraderModels;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
namespace Matriks.Lean.Algotrader
{
public class ST_tek_deneme : MatriksAlgo
{
[SymbolParameter("ADA_USDT_FBIN")]
public string Symbol;
[Parameter(SymbolPeriod.Min15)]
public SymbolPeriod SymbolPeriod;
[Parameter(9)]
public int SuperPeriod;
[Parameter(2.5)]
public decimal Coeff;
public decimal OrderQuantity;
public decimal BuyOrderQuantity;
public decimal SellOrderQuantity;
public bool Baslangic;
public bool Buyzone = false;
public bool Sellzone = false;
public decimal FarkYuksek = 0;
public decimal OranYuksek = 0;
public decimal FarkDusuk = 0;
public decimal OranDusuk = 0;
public decimal ToplamFarkYuksek = 0;
public decimal ToplamFarkDusuk = 0;
public decimal ToplamOranYuksek = 0;
public decimal ToplamOranDusuk = 0;
public bool sentetikEmirdenMI;
decimal AçılışKomisyon;
decimal KapanışKomisyon;
decimal Komisyon;
SuperTrend superTrend;
public override void OnInit()
{
AddSymbol(Symbol, SymbolPeriod);
superTrend = SuperTrendIndicator(Symbol, SymbolPeriod, SuperPeriod, Coeff);
Baslangic = true;
//Bakiye = Bakiye * Kaldirac;
// Gerekli açığa satış
WorkWithPermanentSignal(true);
SendOrderSequential(true);
SendOrderSequentialForShort(true, Side.All);
// #Gerekli açığa satış
// Gerekli - Timestamp
SetTimerInterval(1);
// #Gerekli - Timestamp
}
public decimal BuyEntry, SellEntry;
public int OrderCount = 0;
public int BarCount = 0;
public int longGirisNo, shortCikisNo, longCikisNo, shortGirisNo;
public decimal Ort = 0;
public decimal OrtDusuk, OrtOranYuksek, OrtOranDusuk, dusukSSap, SSap, OranlarStSap;
decimal modAdet = 0;
List<decimal> Farklar = new List<decimal>();
List<decimal> Oranlar = new List<decimal>();
List<decimal> Dusukler = new List<decimal>();
public override void OnDataUpdate(BarDataEventArgs barData)
{
var barDataModel = GetBarData();
var _close = barData.BarData.Close;
decimal Karelertoplami = 0;
decimal dusukKarelerToplami = 0;
decimal oranlarKarelerToplami = 0;
decimal EnFazlaZarar = 0;
decimal EnFazlaKar = 0;
if (CrossAbove(barDataModel, superTrend, OHLCType.Close))
{
Debug("---------------");
Debug(" Long bölgesine girildi");
Debug(" Giriş Fiyatı :" + _close);
if (Baslangic)
{
BuyEntry = _close;
Buyzone = true;
longGirisNo = barData.BarDataIndex;
Debug(" İndeks No : " + longGirisNo);
Baslangic = false;
}
else
{
BuyEntry = _close;
OrderCount += 1;
Debug(" İşlem sayısı : " + OrderCount);
Baslangic = false;
Buyzone = true;
Sellzone = false;
longGirisNo = barData.BarDataIndex;
Debug(" İndeks No : " + longGirisNo);
Debug(" KAPANAN SHORT bölgesi için ==>");
Debug(" Short Pozisyon Giriş Fiyatı :" + SellEntry);
BarCount = Absolute(longGirisNo - shortGirisNo);
Debug(" Bar sayisi :" + BarCount);
var ShortYuksek = HighestHigh(OHLCType.High, BarCount);
Debug(" Kapanan aralıktaki en yüksek değer :" + ShortYuksek);
var ShortDusuk = LowestLow(OHLCType.Low, BarCount);
Debug(" Kapanan aralıktaki en düşük değer :" + ShortDusuk);
FarkYuksek = SellEntry - ShortDusuk;
OranYuksek = Math.Round((FarkYuksek / SellEntry), 3);
Debug(" Kapatılan aralıktaki max kar farkı : " + FarkYuksek);
Debug(" Kapatılan aralıktaki max kar oranı : " + OranYuksek);
FarkDusuk = SellEntry - ShortYuksek;
OranDusuk = Math.Round((FarkDusuk / SellEntry), 3);
Debug(" Kapatılan aralıktaki max zarar farkı : " + FarkDusuk);
Debug(" Kapatılan aralıktaki max zarar oranı : " + OranDusuk);
Debug("---------------");
ToplamFarkYuksek = ToplamFarkYuksek + FarkYuksek;
Ort = Math.Round((OrderCount > 0 ? ToplamFarkYuksek / OrderCount : FarkYuksek), 4);
ToplamFarkDusuk = ToplamFarkDusuk + FarkDusuk;
OrtDusuk = Math.Round((OrderCount > 0 ? ToplamFarkDusuk / OrderCount : FarkDusuk), 4);
ToplamOranYuksek = ToplamOranYuksek + OranYuksek;
OrtOranYuksek = Math.Round((OrderCount > 0 ? ToplamOranYuksek / OrderCount : OranYuksek), 4);
ToplamOranDusuk = ToplamOranDusuk + OranDusuk;
OrtOranDusuk = Math.Round((OrderCount > 0 ? ToplamOranDusuk / OrderCount : OranDusuk), 4);
Farklar.Add(FarkYuksek);
Dusukler.Add(FarkDusuk);
Oranlar.Add(OranYuksek);
// for (int i = 0; i<Farklar.Count; i++)
// {
// Karelertoplami += Power((Farklar[i] - Ort), 2);
// }
// for (int i = 0; i<Dusukler.Count; i++)
// {
// dusukKarelerToplami += Power((Dusukler[i] - OrtDusuk), 2);
// }
for (int i = 0; i<Oranlar.Count; i++)
{
oranlarKarelerToplami += Power((Oranlar[i] - OrtOranYuksek), 2);
}
EnFazlaZarar = Dusukler.Min();
EnFazlaKar = Farklar.Max();
decimal mode = Farklar.GroupBy(i =>i).OrderByDescending(grp =>grp.Count()).Select(grp =>grp.Key).First();
Debug(" xxxxx ");
Debug(" Yuksek Degerler Ortalaması : " + Ort);
Debug(" Dusuk Degerler Ortalaması : " + OrtDusuk);
Debug(" Yuksek Oranlar Ortalaması : " + OrtOranYuksek);
Debug(" Dusuk Oranlar Ortalaması : " + OrtOranDusuk);
//Debug(" Kareler Toplami : " + Karelertoplami);
//var Varyans = OrderCount > 1 ? Karelertoplami / (OrderCount-1) : Karelertoplami;
//SSap = Farklar.Count>1 ? Power((Karelertoplami / (Farklar.Count -1)), 0.5) : Karelertoplami;
//dusukSSap = Dusukler.Count>1 ? Power((dusukKarelerToplami / (Dusukler.Count -1)), 0.5) : dusukKarelerToplami;
OranlarStSap = Oranlar.Count>1 ? Power((oranlarKarelerToplami / (Oranlar.Count -1)), 0.5) : oranlarKarelerToplami;
//Debug(" Kar Al için Standart Sapma : " + SSap);
//Debug(" Zarar Durdur için Standart Sapma :" + dusukSSap);
Debug(" KA oranlar için Standart Sapma :" + OranlarStSap);
Debug(" Maksimum Zarar Durdur Farkı :" + EnFazlaZarar);
Debug(" Maksimum Kar Farkı :" + EnFazlaKar);
Debug(" Mod " + mode);
Debug(" xxxxx ");
}
}
if (CrossBelow(barDataModel, superTrend, OHLCType.Close))
{
Debug("---------------");
Debug(" Short bölgesine girildi");
Debug(" Giriş Fiyatı :" + _close);
if (Baslangic)
{
SellEntry = _close;
Sellzone = true;
shortGirisNo = barData.BarDataIndex;
Debug(" İndeks No : " + shortGirisNo);
Baslangic = false;
}
else
{
SellEntry = _close;
OrderCount += 1;
Debug(" İşlem sayısı : " + OrderCount);
Baslangic = false;
Sellzone = true;
Buyzone = false;
shortGirisNo = barData.BarDataIndex;
Debug(" İndeks No : " + shortGirisNo);
Debug(" KAPANAN LONG bölgesi için ==>");
Debug(" Long Pozisyon Giriş Fiyatı :" + BuyEntry);
BarCount = Absolute(shortGirisNo - longGirisNo);
Debug(" Bar sayisi :" + BarCount);
var LongYuksek = HighestHigh(OHLCType.High, BarCount);
Debug(" Kapanan aralıktaki en yüksek değer :" + LongYuksek);
var LongDusuk = LowestLow(OHLCType.Low, BarCount);
Debug(" Kapanan aralıktaki en düşük değer :" + LongDusuk);
FarkYuksek = LongYuksek - BuyEntry;
OranYuksek = Math.Round((FarkYuksek / BuyEntry), 3);
Debug(" Kapatılan aralıktaki max kar farkı : " + FarkYuksek);
Debug(" Kapatılan aralıktaki max kar oranı : " + OranYuksek);
FarkDusuk = LongDusuk - BuyEntry;
OranDusuk = Math.Round((FarkDusuk / BuyEntry), 3);
Debug(" Kapatılan aralıktaki max zarar farkı : " + FarkDusuk);
Debug(" Kapatılan aralıktaki max zarar oranı : " + OranDusuk);
Debug("---------------");
ToplamFarkYuksek = ToplamFarkYuksek + FarkYuksek;
Ort = Math.Round((OrderCount > 0 ? ToplamFarkYuksek / OrderCount : FarkYuksek), 4);
ToplamFarkDusuk = ToplamFarkDusuk + FarkDusuk;
OrtDusuk = Math.Round((OrderCount > 0 ? ToplamFarkDusuk / OrderCount : FarkDusuk), 4);
ToplamOranYuksek = ToplamOranYuksek + OranYuksek;
OrtOranYuksek = Math.Round((OrderCount > 0 ? ToplamOranYuksek / OrderCount : OranYuksek), 4);
ToplamOranDusuk = ToplamOranDusuk + OranDusuk;
OrtOranDusuk = Math.Round((OrderCount > 0 ? ToplamOranDusuk / OrderCount : OranDusuk), 4);
Farklar.Add(FarkYuksek);
Dusukler.Add(FarkDusuk);
Oranlar.Add(OranYuksek);
// for (int i = 0; i<Farklar.Count; i++)
// {
// Karelertoplami += Power((Farklar[i] - Ort), 2);
// }
// for (int i = 0; i<Dusukler.Count; i++)
// {
// dusukKarelerToplami += Power((Dusukler[i] - OrtDusuk), 2);
// }
for (int i = 0; i<Oranlar.Count; i++)
{
oranlarKarelerToplami += Power((Oranlar[i] - OrtOranYuksek), 2);
}
EnFazlaZarar = Dusukler.Min();
EnFazlaKar = Farklar.Max();
decimal mode = Farklar.GroupBy(i =>i).OrderByDescending(grp =>grp.Count()).Select(grp =>grp.Key).First();
Debug(" xxxxx ");
Debug(" Yuksek Degerler Ortalaması : " + Ort);
Debug(" Dusuk Degerler Ortalaması : " + OrtDusuk);
Debug(" Yuksek Oranlar Ortalaması : " + OrtOranYuksek);
Debug(" Dusuk Oranlar Ortalaması : " + OrtOranDusuk);
//Debug(" Kareler Toplami : " + Karelertoplami);
//var Varyans = OrderCount > 1 ? Karelertoplami / (OrderCount-1) : Karelertoplami;
//SSap = Farklar.Count>1 ? Power((Karelertoplami / (Farklar.Count -1)), 0.5) : Karelertoplami;
//dusukSSap = Dusukler.Count>1 ? Power((dusukKarelerToplami / (Dusukler.Count -1)), 0.5) : dusukKarelerToplami;
OranlarStSap = Oranlar.Count>1 ? Power((oranlarKarelerToplami / (Oranlar.Count -1)), 0.5) : oranlarKarelerToplami;
//Debug(" Kar Al için Standart Sapma : " + SSap);
//Debug(" Zarar Durdur için Standart Sapma :" + dusukSSap);
Debug(" KA oranlar için Standart Sapma :" + OranlarStSap);
Debug(" Maksimum Zarar Durdur Farkı :" + EnFazlaZarar);
Debug(" Maksimum Kar Farkı :" + EnFazlaKar);
Debug(" Mod " + mode);
Debug(" xxxxx ");
}
}
}
public override void OnOrderUpdate(IOrder order)
{
if (order.OrdStatus.Obj == OrdStatus.Filled)
{
}
}
}
}