0 beğenilme 0 beğenilmeme
657 kez görüntülendi
Merhaba,

15 dakikalık grafikte ve tek bir işlem çiftinde (MATIC_USDT_FBIN)
 

RSI 30'u yukarı kırarsa " 3x Long " pozisyon aç %1 Kar pozisyonu kapat.
RSI 70'i aşağı kırarsa " 3x Short " pozisyon aç %1 Kar pozisyonu kapat.

 

Kodlarını yazmaya çalışıyorum fakat teknik bilgim yetmiyor. Al pozisyonunu oluşturabiliyorum fakat satış için % Kar satışı sanırım manuel kod girmem gerekiyor. Yardımcı olursanız çok sevinirim.
Algoritmik Trading kategorisinde (21 puan) tarafından | 657 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme
Merhaba, sizin için bir örnek hazırladım.

Bu örneği mutlaka deneme ortamında test ediniz.

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

Gerçek hesapta ufak miktarlarla test ediniz.

Eğitim videolarımızı mutlaka izlemenizi öneririm.

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



İyi çalışmalar. Kolay gelsin.

 

 

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;

 

/*

▂ ▃ ▅ ▆ █ KRİPEX █ ▆ ▅ ▃ ▂

 

Gönderilen emir iptal olursa belirlenen sayı kadar tekrar gönderilmesi sağlanır.

 

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 tasar : 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("MATIC_USDT_FBIN")]

public string Symbol1;

[Parameter(SymbolPeriod.Min15)]

public SymbolPeriod SymbolPeriod1;

 

[Parameter(3)]

public int MostPeriod1;

 

[Parameter(2)]

public decimal MostPercentage1;

 

[Parameter(MovMethod.E)]

public MovMethod MostMovMethod1;

[Parameter(14)]

public int RsiPeriod1;

[Parameter(1)]

public decimal StopLevel1;

 

//_____________BURAYI KOPYALA________________//

 

[Parameter(5)]

public decimal BuyOrderQuantity;

 

[Parameter(5)]

public decimal SellOrderQuantity;

 

[Parameter(CryptoLeverageType.Cross)]

public CryptoLeverageType kaldirac_tipi_binance_future;

 

[Parameter(3)]

public decimal kaldirac_orani_binance_future;

 

 

//_____________BURAYI KOPYALA________________//

 

RSI rsi;

 

 

 

public override void OnInit()

{

//_____________BURAYI KOPYALA________________//

AddSymbol(Symbol1, SymbolPeriod1);

//_____________BURAYI KOPYALA________________//

 

rsi = RSIIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, RsiPeriod1);

 

//_____________BURAYI KOPYALA________________//

 

// ------------ Timestamp OnInit ------------

SetTimerInterval(1);

// ------------ Timestamp OnInit ------------

 

SetLeverageType(Symbol1, kaldirac_tipi_binance_future); //sadece binance futureda aktif olur.

SetLeverage(Symbol1, kaldirac_orani_binance_future); ////sadece binance futureda aktif olur.

 

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

{

//_____________BURAYI KOPYALA________________//

 

// ------------ Timestamp OnTimer ------------

var sorgu = RejectedOrderList.Where(x => x.Value.BitmexPostOnly == true && DateTime.Now >= x.Value.ExpireDate && x.Value.MinPosition>0);

var oncekiYon = LastOrderSide.Obj;

 

foreach (var deger in sorgu)

{

var order = deger.Value;

LastOrderSide.Obj = Side.All;

var orderID = SendOrder(order.Symbol, order.OrderQty, order.Price, order.Side, order.OrdType, order.TimeInForce, order.TransactionType, order.ChartIcon);

order.MinPosition--;

order.BitmexPostOnly = false;

order.ExpireDate = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);

order.CliOrdID = orderID;

Debug("İptal olan emir tekrar gönderildi. Detay -> CliOrdID: " + order.CliOrdID + " Yon: " + order.Side.Obj.ToString() + " kalan: " + order.MinPosition);

}

 

LastOrderSide.Obj = oncekiYon;

// ------------ Timestamp OnTimer ------------

 

//_____________BURAYI KOPYALA________________//

 

}

 

/// <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(rsi, 30m, 0))

{

//_____________BURAYI KOPYALA________________//

 

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

FX_Alis(Symbol1, BuyOrderQuantity);

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

 

//_____________BURAYI KOPYALA________________//

}

if (CrossBelow(rsi, 70m, 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 ]");

TakeProfit(Symbol1, SyntheticOrderPriceType.Percent, StopLevel1, includeAfterSession:false);

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

TakeProfit(Symbol1, SyntheticOrderPriceType.Percent, StopLevel1, includeAfterSession:false);

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ış

 

// ------------ Timestamp Tanımlar ------------

int KacSaniyeSonraTekrarGonderilsin = 10;

int AyniEmirKacSeferGonderilsin = 3;

Dictionary<string, IOrder> RejectedOrderList = new Dictionary<string, IOrder>();

// ------------ Timestamp Tanımlar ------------

 

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

{

//_____________BURAYI KOPYALA________________//

 

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

{

// ------------ Timestamp OnOrderUpdate Filled ------------

var sorgu = RejectedOrderList.FirstOrDefault(x => x.Value.CliOrdID == order.CliOrdID);

 

if (sorgu.Key != null)

{

Debug("İptal olan  emir gerçekleşti. Detay-> CliOrdID: " + order.CliOrdID + " Text: " + sorgu.Value.Text);

}

// ------------ Timestamp OnOrderUpdate Filled ------------

}

 

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

{

// ------------ Timestamp OnOrderUpdate Rejected ------------

var sorgu = RejectedOrderList.FirstOrDefault(x => x.Value.CliOrdID == order.CliOrdID);

 

if (sorgu.Key == null)

{

order.BitmexPostOnly = true;

order.MinPosition = AyniEmirKacSeferGonderilsin;

order.ExpireDate = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);

 

RejectedOrderList[order.CliOrdID] = order;

 

Debug("Emir iptal oldu. Detay-> CliOrdID: " + order.CliOrdID + " Text: " + order.Text);

}else

{

sorgu.Value.BitmexPostOnly = true;

}

// ------------ Timestamp OnOrderUpdate Rejected ------------

 

}

 

//_____________BURAYI KOPYALA________________//

 

}

 

/// <summary>

/// Strateji durdurulduğunda bu fonksiyon tetiklenir.

/// </summary>

public override void OnStopped()

{

}

}

}
(520 puan) tarafından
Hoş geldiniz, Matriks Destek Platformu sizlere sorularınızın hızlıca cevaplanması için bir ortam sağlar. Sorduğunuz ve cevapladığınız soruların ve yorumlarınızın aldığı oylar üzerinden puan kazanırsınız. Puan sistemine bağlı kampanyamızla ücretsiz kullanım avantajlarından faydalanabilirsiniz.



8,701 soru
8,654 cevap
4,853 yorum
20,181 kullanıcı