0 beğenilme 0 beğenilmeme
326 kez görüntülendi
Sirali gönder secenegiyle olusturulmus algoritmada , “hangisi once gelirse” secenegine ragmen , stop calistigi durumda stop yonunde yeni pozisyon acmiyor. Sirasiz gonderde bu sorun cozulse de bu defa ayni anda portfoyun uygunluguna gore pespese cok sayida  emir gonderiyor. Ornek  viopda 1. Durumda yani”sirali” da ve “hangisi once gelirse” de sinyal geldiginde al yonunde pozisyon aciyor, diyelim ki bu pozisyon iz suren stopla satis yapilarak kapaniyor, bunun uzerine sinyal uygun olsada tekrar satis emri gondermiyor , yeni pozisyona al ile basliyor. Sendordersequential false yaptigimizda ise, stop satisindan sonra , yeni pozisyonu satis olarak aciyor ancak her emiri bir dakikada gonderilecek emir limiti miktarinda pespese gonderiyor.
Algoritmik Trading kategorisinde (12 puan) tarafından | 326 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhaba, sorunuza istinaden size bir örnek paylaşıyorum.

Bu örneği önce Matriks Deneme Ortamında test ediniz.

Gerçek hesapta ufak miktarlarla test ediniz.

Doğru çalıştığına emin olmadan kullanmayınız.

İlk işlemi seçmek için "HangiIslemleBaslasin" Seçeneğinden seçimizi yapabilirsiniz.

Vadeli bir sembolde kullanmak için "AcigaSatisYapilsin" kutucuğu onaylı olmalıdır.

Spot piyasa için "AcigaSatisYapilsin" kutucuğu onaylı olmamalıdır.

Olası sorularınız için iqdestek@matriksdata.com adresine yazabilirsiniz.

 

 

 

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;

 

/*

 

Bu şablon AcigaSatisYapilsin seçeneği aktif olduğunda Viop ve Binance Future piyasaları için uygun olur.

AcigaSatisYapilsin seçeneği pasif olduğunda istenilen piyasada işlem yapacaktır.

 

Stratejinin çift yönlü ilerlemesi istendiğinde AcigaSatisYapilsin seçeneğinin aktif edilmesi gerekir ( varsayılan aktif )

 

Akşam seansında da oluşan sinyallere emir gönderilmesi için AksamSeansiniDahilEt seçeneğinin aktif edilmesi gerekir ( varsayılan pasif )

Kripto piyasası 7/24 açık olduğu için bu seçeneğin aktif ya da pasif seçilmesi birşey değiştirmez. 

 

HangiIslemleBaslasin değişkeni ile stratejinin ilk Long ya da Short pozisyon ile başlaması sağlanabilir.

 

*** Stratejiye eklenen sentetik emirler tetiklendiğinde pozisyon sıfırlanıp ilk gelecek sinyale göre işleme girecektir.

 

*/

 

namespace Matriks.Lean.Algotrader

{

public class VIOP2KOSUL_Kopyaol : 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("X30YVADE")]

public string Symbol1;

 

 

[Parameter(SymbolPeriod.Min5)]

public SymbolPeriod SymbolPeriod1;

 

[Parameter(3)]

public int MostPeriod1;

 

[Parameter(2)]

public decimal MostPercentage1;

 

[Parameter(MovMethod.E)]

public MovMethod MostMovMethod1;

// senetik emir

 

[Parameter(3)]

public decimal kar_al;

 

[Parameter(2)]

public decimal zarar_durdur;

 

[Parameter(1)]

public decimal iz_suren;

// senetik emir

 

//_____________BURAYI KOPYALA________________//

 

[Parameter(5)]

public decimal BuyOrderQuantity;

 

[Parameter(5)]

public decimal SellOrderQuantity;

 

//_____________BURAYI KOPYALA________________//

 

MOST most;

 

 

 

public override void OnInit()

{

 

most = MOSTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, MostPeriod1, MostPercentage1, MostMovMethod1);

 

//_____________BURAYI KOPYALA________________//

 

// Gerekli başla - Açığa satış

WorkWithPermanentSignal(true);

SendOrderSequential(true, HangiIslemleBaslasin);

SendOrderSequentialForShort(true, Side.All);

// #Gerekli bitti - Açığa satış

 

//_____________BURAYI KOPYALA________________//

 

//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>

/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.

/// </summary>

public override void OnTimer()

{

 

}

 

/// <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 (CrossAbove(most, most, 1, 0))

{

//_____________BURAYI KOPYALA________________//

 

// Gerekli başla - Açığa satış

FX_Alis(Symbol1, BuyOrderQuantity);

// #Gerekli bitti - Açığa satış

 

//_____________BURAYI KOPYALA________________//

}

if (CrossBelow(most, most, 1, 0))

{

//_____________BURAYI KOPYALA________________//

 

// Gerekli başla - Açığa satış

FX_Satis(Symbol1, SellOrderQuantity);

// #Gerekli bitti - Açığa satış

 

//_____________BURAYI KOPYALA________________//

}

 

}

 

//_____________BURAYI KOPYALA________________//

 

// Gerekli başla - 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 ]");

// senetik emir

TakeProfit(Symbol1, SyntheticOrderPriceType.Percent, kar_al, includeAfterSession:AksamSeansiniDahilEt);

StopLoss(Symbol1, SyntheticOrderPriceType.Percent, zarar_durdur, includeAfterSession:AksamSeansiniDahilEt);

TrailingStopLoss(Symbol1, SyntheticOrderPriceType.Percent, iz_suren, includeAfterSession:AksamSeansiniDahilEt);

// senetik emir

LastOrderSideForShort = LastOrderSide;

sentetikEmirdenMI = false;

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 ]");

// senetik emir

TakeProfit(Symbol1, SyntheticOrderPriceType.Percent, kar_al, includeAfterSession:AksamSeansiniDahilEt);

StopLoss(Symbol1, SyntheticOrderPriceType.Percent, zarar_durdur, includeAfterSession:AksamSeansiniDahilEt);

TrailingStopLoss(Symbol1, SyntheticOrderPriceType.Percent, iz_suren, includeAfterSession:AksamSeansiniDahilEt);

// senetik emir

LastOrderSideForShort = LastOrderSide;

sentetikEmirdenMI = false;

sonuc = true;

}

return sonuc;

}

 

bool sentetikEmirdenMI = false;

 

public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)

{

if (sOrder.EnableOrderSending)

{

if (AcigaSatisYapilsin)

{

LastOrderSide.Obj = Side.All;

sentetikEmirdenMI = true;

}

 

Debug("Sentetik emir tetiklendi");

}

}

// #Gerekli bitti - Açığa satış

 

//_____________BURAYI KOPYALA________________//

 

/// <summary>

/// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir.

/// </summary>

/// <param name="barData">Emrin son durumu</param>

public override void OnOrderUpdate(IOrder order)

{

}

 

/// <summary>

/// Strateji durdurulduğunda bu fonksiyon tetiklenir.

/// </summary>

public override void OnStopped()

{

}

}

}

(520 puan) tarafından
8,636 soru
8,590 cevap
4,821 yorum
19,798 kullanıcı