Teknik Analiz Dünyasına Hoşgeldiniz. Paylaşmak Güzeldir.

Yayından kaldırmak istediğiniz formüller için algoritmabul@gmail.com ile iletişime geçebilirsiniz... 

  • DİKKAT: Formüller, Sistemler sadece eğitim amaçlıdır. Alım satım, olası anapara kaybı ve diğer kayıplar dahil olmak üzere "YÜKSEK RİSK" içerir.
  • “Hiç zengin olan bir teknik analist görmedim” diyenlere hep gülmüşümdür. Bu kadar saçma ve küstahça bir şey daha duymadım. Dokuz yıl boyunca temel analiz kullandıktan sonra, teknik analizci olarak zengin oldum. “ (Marty Schwartz)

Heikin-Ashi mumlarıyla Long/Short yapan Multiple Time Frame EMA Stratejisi - Matriks IQ

dyigitus

the authority
Algorithmist
Katılım
14 May 2022
Mesajlar
1
Ekli görseldeki parametre aralıklarında BACKTEST yapabilirsiniz. Backtest yaparken TÜM BARLARI seçmenizi öneririm. Lütfen kendi süzgecinizden geçiriniz. Katkı yapmanız, stratejiyi daha da geliştirip iyileştirmeniz halinde benimle de paylaşırsanız sevinirim. İçerisinde emrin hata sonucu Binance borsasına iletilememesi halinde tekrar edilmesine yarayan kodlar mevcuttur. Zarar durumlarında sorumluluk kabul edilmez. Matriks IQ için uygundur.

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
using Matriks.AI;
using Matriks.AI.AiParameters;
using Matriks.AI.Data;
using Matriks.Trader.Core.TraderModels;

namespace Matriks.Lean.Algotrader
{
public class HA_EMA_LS : MatriksAlgo
{
// Strateji çalıştırılırken kullanacağımız parametreler. Eğer sembolle ilgili bir parametre ise,
// "SymbolParameter" ile, değilse "Parameter" ile tanımlama yaparız. Parantez içindeki değerler default değerleridir.


[SymbolParameter("BNB_USDT_FBIN")]
public string Symbol1;


[Parameter(SymbolPeriod.Min180)]
public SymbolPeriod SymbolPeriod1;

[Parameter(SymbolPeriod.Min5)]
public SymbolPeriod SymbolPeriod2;



[Parameter(1)]
public int EmaPeriod1;

[Parameter(60)]
public int EmaPeriod2;

[Parameter(1)]
public decimal OrderQuantity1;

[Parameter(false)]
public bool IsReduceOnly1;

[Parameter(false)]
public bool IsReduceOnly2;

[Parameter(10)]
public decimal Leverage2;

[Parameter(false)]
public bool IsReduceOnly3;

[Parameter(CryptoLeverageType.Isolated)]
public CryptoLeverageType LeverageType3;

[Parameter(1)]
public decimal OrderQuantity4;

[Parameter(false)]
public bool IsReduceOnly4;

[Parameter(false)]
public bool IsReduceOnly5;

[Parameter(10)]
public decimal Leverage5;

[Parameter(false)]
public bool IsReduceOnly6;

[Parameter(CryptoLeverageType.Isolated)]
public CryptoLeverageType LeverageType6;

EMA ema;
EMA ema2;


int FirstRun = 0;
int realposition = 0;


public override void OnInit()
{
var periodInfo = GetHeikinAshiPeriodInfo(SymbolPeriod1);
AddSymbol(Symbol1, periodInfo);

ema = EMAIndicator(Symbol1, periodInfo, OHLCType.Close, EmaPeriod1);
ema2 = EMAIndicator(Symbol1, periodInfo, OHLCType.Close, EmaPeriod2);

SetLeverage(Symbol1, Leverage2);
SetLeverageType(Symbol1, LeverageType3);
SetLeverage(Symbol1, Leverage5);
SetLeverageType(Symbol1, LeverageType6);

SendOrderSequential(true, Side.All);
WorkWithPermanentSignal(true);

//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.
// SetTimerInterval(3600);

//Alttaki fonksiyon ile tanımlanan sembol ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.
//AddNewsSymbol(Symbol);

//Alttaki fonksiyon ile tanımlanan anahtar kelime ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.
//AddNewsKeyword("KAP");
}

/// <summary>
/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir
/// </summary>
public override void OnInitCompleted()
{

}

/// <summary>
/// AddNewsSymbol ve AddNewsKeyword ile haberlere kayit olunmuşsa bu fonksiyon tetiklenir.
/// </summary>
/// <param name="newsId">Gelen haberin id'si</param>
/// <param name="relatedSymbols">Gelen haberin ilişkili sembolleri</param>
public override void OnNewsReceived(int newsId, List<string> relatedSymbols)
{

}

/// <summary>
/// Eklenen sembollerin bardata'ları ve indikatorler güncellendikçe bu fonksiyon tetiklenir.
/// </summary>
/// <param name="barData">Bardata ve hesaplanan gerçekleşen işleme ait detaylar</param>
public override void OnDataUpdate(BarDataEventArgs barData)
{
if (CrossBelow(ema2, ema, 0, 0))
{
if (FirstRun == 0)
{
SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession:false, isReduceOnly : IsReduceOnly1);
FirstRun = 1;
}
else
{
SendMarketOrder(Symbol1, OrderQuantity1 * 2, OrderSide.Buy, includeAfterSession:false, isReduceOnly : IsReduceOnly1);
}
}
if (CrossBelow(ema, ema2, 0, 0))
{
if (FirstRun == 0)
{
SendMarketOrder(Symbol1, OrderQuantity4, OrderSide.Sell, includeAfterSession:false, isReduceOnly : IsReduceOnly4);
FirstRun = 1;
}
else
{
SendMarketOrder(Symbol1, OrderQuantity4 * 2, OrderSide.Sell, includeAfterSession:false, isReduceOnly : IsReduceOnly4);
}
}
}
public class OrderListTimestamp
{

public string ID;

public string Sembol;

public decimal Adet;

public decimal Fiyat;

public OrdType EmirTipi;

public OrderSide orderSide;

public string EmirYonu;

public DateTime TetiklenmeZamani;

public int Sayac;

public bool AktifMI;

}



Dictionary<string, OrderListTimestamp> timestampDict = new Dictionary<string, OrderListTimestamp>();



[Parameter(3)]

public int AyniEmirKacSeferGonderilsin;



[Parameter(10)]

public int KacSaniyeSonraTekrarGonderilsin;



public override void OnOrderUpdate(IOrder order)
{

if (order.OrdStatus.Obj == OrdStatus.Filled)
{

Debug("gerçekleşti");



if (timestampDict.ContainsKey(order.CliOrdID))
{

timestampDict.Remove(order.CliOrdID);

Debug("Timestamp hatasına takılan emriniz gerçekleşti.");

}

}



if (order.OrdStatus.Obj == OrdStatus.Rejected)
{

if (!timestampDict.ContainsKey(order.CliOrdID))
{

OrderListTimestamp orderList = new OrderListTimestamp();

orderList.ID = order.CliOrdID;

orderList.Sembol = order.Symbol;

orderList.Adet = order.OrderQty;

orderList.Fiyat = order.Price;

orderList.EmirTipi = order.OrdType;

orderList.TetiklenmeZamani = DateTime.Now;

orderList.Sayac = 0;

orderList.AktifMI = false;



if (order.Side.Obj == Side.Buy)
{

orderList.orderSide = OrderSide.Buy;

orderList.EmirYonu = "Alış";

}else
{

orderList.orderSide = OrderSide.Sell;

orderList.EmirYonu = "Satış";

}



timestampDict[order.CliOrdID] = orderList;

}



if (order.Text.Contains("Timestamp"))
{

if (timestampDict.ContainsKey(order.CliOrdID))
{

if (timestampDict[order.CliOrdID].Sayac < AyniEmirKacSeferGonderilsin)
{

timestampDict[order.CliOrdID].TetiklenmeZamani = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);

timestampDict[order.CliOrdID].Sayac++;

timestampDict[order.CliOrdID].AktifMI = true;



Debug("Emir Timestamp hatasından dolayı iptal oldu tekrar gönderilecek");

}else
{

timestampDict.Remove(order.CliOrdID);

Debug("Aynı emir üst üste " + AyniEmirKacSeferGonderilsin + " defa gönderildi.");

}

}

}

}

}





string orderIDTimestamp = string.Empty;



public override void OnTimer()
{

var tutt = timestampDict.Where(x => x.Value.AktifMI == true && DateTime.Now >= x.Value.TetiklenmeZamani);



if (tutt.Count() >0)
{

foreach (var deger in tutt)
{

LastOrderSide.Obj = deger.Value.orderSide == OrderSide.Buy? Side.Sell:Side.Buy;



if (deger.Value.EmirTipi.Obj == OrdType.Limit)
{

orderIDTimestamp = SendLimitOrder(deger.Value.Sembol, deger.Value.Adet, deger.Value.orderSide, deger.Value.Fiyat);

Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");

}else if (deger.Value.EmirTipi.Obj == OrdType.Market)
{

orderIDTimestamp = SendMarketOrder(deger.Value.Sembol, deger.Value.Adet, deger.Value.orderSide);

Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");

}



deger.Value.ID = orderIDTimestamp;

deger.Value.AktifMI = false;

timestampDict[orderIDTimestamp] = deger.Value;

timestampDict.Remove(deger.Key);



}

}

}

// #Gerekli - Timestamp







// Gerekli açığa satış

[Parameter(true)]

public bool AcigaSatisYapilsin;

[Parameter(false)]

public bool AksamSeansiniDahilEt;

[Parameter(Side.All)]

public Side HangiIslemleBaslasin;



public bool FX_Alis(string sembol, decimal quantity)
{

bool sonuc = false;

if (LastOrderSide.Obj != Side.Buy)
{

var _quantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin) ? quantity:(LastOrderSideForShort.Obj == Side.All) ? quantity:quantity * 2; SendMarketOrder(sembol, _quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);

Debug("Alış emri gönderildi.[ " + _quantity + " adet ]");

LastOrderSideForShort = LastOrderSide;

sonuc = true;

}

return sonuc;

}



public bool FX_Satis(string sembol, decimal quantity)
{

bool sonuc = false;

if (LastOrderSide.Obj != Side.Sell)
{

var _quantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin) ? quantity:(LastOrderSideForShort.Obj == Side.All) ? quantity:quantity * 2; SendMarketOrder(sembol, _quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);

Debug("Satış emri gönderildi.[ " + _quantity + " adet ]");

LastOrderSideForShort = LastOrderSide;

sonuc = true;

}

return sonuc;

}



public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)
{

if (sOrder.EnableOrderSending)
{

Debug("Sentetik emir tetiklendi"); if (AcigaSatisYapilsin)

LastOrderSide.Obj = Side.All;

}

}

// #Gerekli açığa satış

}

}
 

Ekli dosyalar

  • HA_EMA_LS.JPG
    HA_EMA_LS.JPG
    113.3 KB · Görüntüleme: 62
  • HA_EMA_LS_rapor.JPG
    HA_EMA_LS_rapor.JPG
    100.4 KB · Görüntüleme: 58
Son düzenleme:

Bogac

the authority
Algorithmist
Kripto
Katılım
28 Ocak 2021
Mesajlar
23
Bu kod dizisinde "symbolperiod2" frame'i symbol olarak eklenmemiş. Ayrıca period info şu şekilde de çekilir;
[Parameter(SymbolPeriod.Min240)]
public SymbolPeriod SymbolPeriod;

public SymbolPeriod MTF = SymbolPeriod.Day;

PeriodInfo pInfo;
PeriodInfo pInfo2;

public override void OnInit()

pInfo = GetHeikinAshiPeriodInfo(SymbolPeriod);
pInfo2 = GetHeikinAshiPeriodInfo(MTF);
AddSymbol(Symbol, SymbolPeriod);
AddSymbol(Symbol, pInfo);
AddSymbol(Symbol, pInfo2);

İkinci bir konu ise üst frame içerisinde alt frame data çalıştırabilmeniz için bir kod dizisi yazarak period kontrolü gerçekleştirmeniz gerekir. Eklenen bütün frame'ler AddSymbol ile tanımlanmalı ve ilgili değişkenden GetSelectedValueFromBarData fonksiyonu ile veya alternatif olarak;
var close180 = GetBarData();
var Close = close180.Close[barData.BarDataIndex - 1]; (veya -1 olmadan yazarsanız şimdiki bar datasını çeker -1 1 önceki barı temsil ediyor istediğiniz sayı her neyse previni çekersiniz.)
şeklinde çekilebilir. Verdiğiniz strateji copy paste'den öteye geçmiyor daha dikkatli olalım. bardata.BarDataIndex fonksiyonu main frame add symbol ile ilk eklenen frame datasını çeker aynı anda hem heiken hemde normal bardatayı çekmek için GetSelected... fonksiyonunu kullanmak daha yararlı olacaktır. İyi çalışmalar.
 

Forumdan daha fazla yararlanmak için giriş yapın yada üye olun!

Forumdan daha fazla yararlanmak için giriş yapın veya kayıt olun!

Kayıt ol

Forumda bir hesap oluşturmak tamamen ücretsizdir.

Şimdi kayıt ol
Giriş yap

Eğer bir hesabınız var ise lütfen giriş yapın

Giriş yap