EA'lar kurtarmak için kodlanmalıdır. Güç kesilirse, işletim sistemi çökerse, terminal veya çizelge yanlışlıkla kapatılırsa, bir sonraki tıklamada tüm statik/küresel bilet değişkenleri kaybolmuş olacaktır. Açık bir emriniz olacak ama bunu bilmiyorsunuz, bu yüzden EA asla onu kapatmaya, SL'yi takip etmeye çalışmayacak, vb. Nasıl kurtaracaksınız? Gerekli bilet numaralarını kurtarmak veya kalıcı olarak depolamak (GV/dosya) için bir OrderSelect döngüsü kullanın.
Merhaba, kodu aşağıdaki şekilde değiştirip ekledim.
//---------------------- Buy/Sell function (limit orders) int BuyCall( double BC) { if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true) { if ( BuyTicket == 0) { BuyStopLoss = BC - (StopLoss * CalcPoint1); BuyTakeProfit = BC + (TakeProfit * CalcPoint1); BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green); SellTicket = 0; // counter trade// if( Bid < BuyStopLoss && SellTicket == 0 ) { if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true) { SellStopLoss = Bid + (StopLoss * CalcPoint1); SellTakeProfit = Bid - (TakeProfit * CalcPoint1); SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red); BuyTicket = 0; } } } }
Hala her tik ile aynı siparişleri birden çok kez alıyor.
Artı eğer "!" imzala, o zaman herhangi bir işlem yapmıyor.
Son olarak, ana işlevimden buyticket & sellticket kontrolünü kaldırmam gerekir mi?
Teşekkür ederim
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
Video oynatmakLütfen yayınınızı düzenleyin .
Büyük miktarda kod için ekleyin.- Asla if( (2+2 == 4) == true) yazmazsın , değil mi? if(2+2 == 4) yeterlidir. Bu nedenle if(bool == true) yazmayın, sadece if(bool) veya if( ! bool) kullanın. bool isLongEnabled gibi anlamlı değişken adları kullandığınızda kod kendi kendini belgeleyen hale gelir. Long_Entry, tetikleyici bir fiyat veya bilet numarası gibi görünür ve "uzun giriş varsa" eksik bir cümledir.
- BuyTicket'in kapanıp kapanmadığını nereden kontrol ediyorsunuz? Bilete göre seçim her zaman doğru olacaktır (geçerli bir bilet numarası verildiğinde), sipariş bekleyen, açık, kapalı veya silinmiş olabilir.
- OrderSelect döngüsü önerimi tamamen görmezden geldiniz.
Merhaba WHReder, cevabınız için teşekkür ederiz.
Evet, bunları SRC koduna ekledim. Ama editlediğimde görünmüyordu.
Önerdiğiniz gibi == doğru terimleri kaldırdım.
Lütfen beni yanlış anlama, bu orderselect döngüsünü anlamakta zayıf bir noktam var. göz ardı etmedim. Eklemeyi denedim, çok karmaşık olsa da, çalıştırırken 16 hata ve 2 uyarı gösteriyor. Bu kodda MN.Count nedir?
// extern int Magic.Number.Base = ... // int magic.number.max; // Export to OpenOrder/MySelect // string market.pair; // Export to OpenOrder/MySelect // int init(){ // market.pair = Symbol(); // magic.number.max = Magic.Number.Base + MN.COUNT - 1;
Satın alma biletini kontrol etme hakkında kapalı. Kontrol etmedim çünkü mevcut fiyatın buystoploss'un altında olup olmadığını kontrol ettim ve ardından alım satım kapandı. böylece satış emri açıldı.
Bid < BuyStopLoss
Saygılarımızla
Kodu biraz böyle düzenliyorum...Ama şimdi 2 hata gösteriliyor.."Myselect" & "MyOrdersTotal" sadece global kapsamda bildirilebilir.
int BuyCall( double BC) { //-----------code bool MySelect( int iWhat, int eSelect, int ePool=MODE_TRADES){ if (! OrderSelect (iWhat, eSelect, ePool) ) return ( false ); int mn = OrderMagicNumber(); if (mn < MNB1 ) return ( false ); if (mn > MNB2 ) return ( false ); if (OrderSymbol() != Pair ) return ( false ); if (ePool != MODE_HISTORY ) return ( true ); return (OrderType() <= OP_SELL); } int MyOrdersTotal( int op=- 1 , int ePool=MODE_TRADES){ #define OP_ALL - 1 if (ePool == MODE_TRADES) iPos = OrdersTotal () - 1 ; else iPos = OrdersHistoryTotal() - 1 ; for (nOrders= 0 ; iPos >= 0 ; iPos--) if ( MySelect(iPos, SELECT_BY_POS, ePool)) if ( op == OP_ALL || op == OrderType() ) nOrders++; return (nOrders); } if (! OrderSelect (BuyTicket, SELECT_BY_TICKET)) { if ( BuyTicket == 0 ) { BuyStopLoss = BC - (StopLoss * CalcPoint1); BuyTakeProfit = BC + (TakeProfit * CalcPoint1); BuyTicket = OrderSend ( Symbol (),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit, "Buy limit Order" ,MagicNumber,expiration,Green); SellTicket = 0 ; // counter trade// if ( Bid < BuyStopLoss && SellTicket == 0 ) { if (! OrderSelect (SellTicket, SELECT_BY_TICKET)) { SellStopLoss = Bid + (StopLoss * CalcPoint1); SellTakeProfit = Bid - (TakeProfit * CalcPoint1); SellTicket = OrderSend ( Symbol (),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit, "Sell Order" ,MagicNumber, 0 ,Red); BuyTicket = 0 ; } } } } return (BuyTicket); }
Başka bir işlevin içinde bir işlev bildiremezsiniz
O zaman bunu nasıl yapabilirim. Yani bir alım/satım emri açmak için tek tek kontrol etmem gereken birçok şartım var.
Bu yüzden kodu kolaylaştırmak için bir buycall/sellcall işlevi yaptım.
Onun sadece EA pek çok aynı esnaf alıyor. Bunu nasıl durduracağımı bilmiyorum.
Başka bir işlevin içinde bir işlev bildiremezsiniz
O zaman bunu nasıl yapabilirim. Yani bir alım/satım emri açmak için tek tek kontrol etmem gereken birçok şartım var.
Bu yüzden kodu kolaylaştırmak için bir buycall/sellcall işlevi yaptım.
Onun sadece EA pek çok aynı esnaf alıyor. Bunu nasıl durduracağımı bilmiyorum.
Her şeyden önce, başka bir işlevin içinde bir işlev bildirmeye çalışmayın.
Gönderdiğiniz koda bakarak ne yapmaya çalıştığınızı çözemiyorum. Bu yüzden sana yardım edemem.
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Merhaba, bir Ea yaptım, ancak teste geri döndüğümde, her bir onayda aynı bekleyen siparişleri oluşturuyor. Bunu nasıl durdurabilirim. Bir seferde sadece bir siparişe ihtiyacım var, onun kopyasına ihtiyacım yok.
Bu EA'yı saatlik grafikte " yalnızca açık fiyat " ile çalıştırırsam, kopya oluşturmaz.
Ayrıca, satın alma limiti başarısız olursa, benim cihazım ters ticaret seçeneğine sahiptir ve ardından satış ticaretini açar. Lütfen ayrıca doğru bir şekilde kurup kurmadığımı da bana bildirin. Herhangi bir yardım takdir edilecektir.
Zaman ayırdığınız için teşekkür ederim.