Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › Mászkáló Trail
Címkézve: trailingstop követőstop mql4
-
SzerzőBejegyzés
-
Szia Radu!
Már megint kínom van. Csúszóstopot állítanék be, de nem csak a „jó” irányban csúszik, hanem visszafelé is.
Ránéznél? Előre is köszönöm: Koszavoid StepTrail() { double SumL=((LoLot()+ShLot())*LotSize)/AccountEquity(); int TrailingStart=TrStart/(SumL/L); if(TrailingStart<5)TrailingStart=5; int TrailingSize=TrSize/(SumL/L); if(TrailingSize<5)TrailingSize=5; int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL) + 1; double sl; int cnt = OrdersTotal(); for ( int i=0; i<cnt; i++) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if (OrderSymbol() != Symbol()) continue; if (OrderMagicNumber() != MagicSth) continue; int type = OrderType(); if (type == OP_BUY && LoLot()>=ShLot()) { if (Bid-OrderOpenPrice() > TrailingStart*Point*fpc()&& LoLot()>=ShLot()) { sl = Bid - TrailingSize*Point*fpc(); if (sl >= Bid - StopLevel*Point) continue; if (OrderStopLoss() < sl - 1*Point*fpc()|| OrderStopLoss() == 0) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if (OrderSymbol() != Symbol()) continue; if (OrderMagicNumber() != MagicSth) continue; OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clModify); } } } if (type == OP_SELL && ShLot()>=LoLot()) { if (OrderOpenPrice()-Ask > TrailingStart*Point*fpc() && ShLot()>=LoLot()) { sl = Ask + TrailingSize*Point*fpc(); if (sl <= Ask + StopLevel*Point) continue; if (OrderStopLoss() > sl + 1*Point*fpc() || OrderStopLoss() == 0) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if (OrderSymbol() != Symbol()) continue; if (OrderMagicNumber() != MagicSth) continue; OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clModify); } } } } }
A stopleveles ellenőrzés dicséretes, de a javított érték kapcsán mindig ellenőrizd, hogy maga a javított érték kedvezőbb-e mint a jelenlegi beállított stoploss érték (értsd: LONG esetén magasabb, SHORT esetén alacsonyabb). Ha ez a feltétel nem teljesül, akkor ne engedd a módosítást, mert akkor fog „táncolni” a stoploss.
Illetve ez az 1 pont hozzáadás katasztrófális, soha ne drótozz ilyesmit a kódodba. Nincs szükség reszelésre, ha valami nem működik univerzálisan, akkor rosszul van felépítve:
OrderStopLoss() > sl + 1*Point*fpc()
Ezt felejtsd el! Használd a NormalizeDouble() eljárást, és hasonlítsd össze a konkrét, megfelelő tizedesjegyre kerekített értékeket. (Amúgy az fpc() függvény nem tudom mit csinál, mivel azt nem csatoltad.)
Ez a sor (és a Bid-es párja) hibás, mivel az egyenlőség egyébként megengedhető:
if (sl <= Ask + StopLevel*Point) continue;
Értem, hogy mit akarsz, de javítsd ki mert ez így ebben a formában helytelen.
Illetve még egy javaslatom van: a continue-k féktelen használata helyett a feltételek igaz ágára építs inkább, lévén hogy egy jól felépített kondíciós rendszernél a nem teljesülés miatt úgyis továbblép a ciklus, nem kell erre külön megkérni. Ráadásul ha már egyszer leellenőrzöd a feltételeket, akkor miért kell újra szűrni rájuk 4 sorral lejjebb? Gondolok itt az instrumentumra, magic számra, stb. Ugyanez igaz a többszöri OrderSelect-re is.
Hello kosza.
Érdemes körülnézni az MetaTrader kódkönyvtárában.
Sokat lehet tanulni az ott közzé tett kódokból.Egy működő TrailingStop megoldást pl. itt találsz:
https://www.mql5.com/en/code/12232
Igaz ez a kód nem csak követőstoppot hanem a TakeProfit és a StopLoss megoldását is tartalmazza.
A view linkre kattintva láthatod a kódot.
(Bár szvsz. még ezt is lehetne bőven tovább egyszerűsíteni, átláthatóbbá tenni) -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.