Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › Függő megbízás elhelyezése
Címkézve: OP_BUYSTOP, OP_SELLSTOP
-
SzerzőBejegyzés
-
Szeretnék egy ECN számlán egy adott pillanatban egyszerre két függő megbízást (OP_BUYSTP,OP_SELLSTOP) elhelyezni. Az adott ár fölé Buy-t az adott ár alá Sell-t.
A Sell megbízást kihelyezi de a Buy-t 130-as hibakóddal vissza dobja majd az 5.dik vagy 6.dik próbálkozásra kihelyezi. Nem értem,hogy miért? Mivel nem is adok neki stopszintet. ECN számlán ezt nem is tehetem meg.
Ezzel kapcsolatban szeretnék segítséget kérni, hogy milyen módszerrel tudnák egy adott pillanatban egyszerre két függő megbízást kihelyezni a legegyszerűbben és a leggyorsabban mivel egy skalp robothoz szeretném használni.
Jelenleg ezt a kódot használom :
int Perc=10; double Lot=0.1; double Par_1 = iOpen("EURUSD",PERIOD_M1,0); NormalizeDouble(Par_1,5); double BuyTavolsag =(Par_1+0.0005); NormalizeDouble(BuyTavolsag_USD_EURUSD,5); double SellTavolsag = (Par_1-0.0005); NormalizeDouble(SellTavolsag_USD_EURUSD,5); if(Perc==Minute()) { int Buy_Ticket=OrderSend("EURUSD",OP_BUYSTOP,Lot,BuyTavolsag,0,0,0,"Magic szám : ",Buy_Magic,0,Green); if(Buy_Ticket<0){Print("Buy Stop Hiba : ",GetLastError());} int Sell_Ticket=OrderSend("EURUSD",OP_SELLSTOP,Lot,SellTavolsag,0,0,0,"Magic szám : ",Sell_Magic,0,Red); if(Sell_Ticket<0){Print("Sell Stop Hiba : ",GetLastError());} }
A segítséget előre is köszönöm. :-)
Függő megbízásnál megadhatod a TP/SL értékeket ECN számlán is. A korlátozás, amire gondolsz csak piaci pozíciónál él.
A BUY STOP kihelyezésének sikertelensége valószínűleg a stop szint (minimum eltartás az aktuális ártól) miatt kerül elutasításra, és az ár előbb-utóbb „elmozog” annyit, amennyi a helyes érték kiszámításához elegendő.
Ezeket a feltételeket vedd figyelembe! Ask és Bid árak közötti különbség is lényeges, hiszen a charton látható árak mindegyike Bid ár, míg BUY típusú pozíciókat Ask áron tudsz nyitni.
A NormalizeDouble -nál ne fix tizedesjegyet használj, hanem a Digits előre definiált változót – de ez már csak kekeckedés a részemről.
Nagyon szépen köszönöm a kielégítő választ. :-)
Az előző kódomat a következőképpen változtattam meg :
int Min=MarketInfo(“EURUSD”,MODE_STOPLEVEL); int Perc=10; double Lot=0.1; double Par_1_Buy=Ask+Min*Point;NormalizeDouble(Par_1_Buy,Digits); double Par_1_Sell = Bid; NormalizeDouble(Par_1_Sell,Digits); double BuyTavolsag =(Par_1_Buy+0.0005); NormalizeDouble(BuyTavolsag_USD_EURUSD,Digits); double SellTavolsag = (Par_1_Sell-0.0005); NormalizeDouble(SellTavolsag_USD_EURUSD,Digits); if(Perc==Minute()) { int Buy_Ticket=OrderSend(“EURUSD”,OP_BUYSTOP,Lot,BuyTavolsag,0,0,0,”Magic szám : “,Buy_Magic,0,Green); if(Buy_Ticket<0){Print(“Buy Stop Hiba : “,GetLastError());} int Sell_Ticket=OrderSend(“EURUSD”,OP_SELLSTOP,Lot,SellTavolsag,0,0,0,”Magic szám : “,Sell_Magic,0,Red); if(Sell_Ticket<0){Print(“Sell Stop Hiba : “,GetLastError());} }
Mit gondolsz róla Radu?
És számomra az meg teljesen új információ volt, hogy ECN számlán függő megbízáshoz adhatok SL/TP szintet is.:-)
Köszönöm!
YocA MarketInfo -ban a konkrét instrumentummegadás helyett használd a Symbol()-t. Felesleges bedrótozni valamit a robotodba, úgyis rá akarod majd tenni más instrumentumokra is, akkor pedig a hajadat téped majd az esetleges berögzített érték által okozott hibák miatt.
A „double BuyTavolsag” kezdetű sorban a BuyTavolsag_USD_EURUSD változónév lényegét nem látom át, a NormalizeDouble -t meg nem kell külön futtatnod, bőven lehet egybe is szerkeszteni a két számítást. Erre gondolok:
double Par_1_Buy=NormalizeDouble(Ask+Min*Point, Digits)
Az OrderSendnél szintén ne drótozd be az instrumentumnevet, illetve a hibakezelésen még van mit dolgozni. Hozz létre egy ciklust véges számú próbálkozással, amely folyamatosan fog próbálkozni ha a kötés nem született meg valamilyen oknál fogva.
Szerinted így Radu?
//---------------------------------------------------------------------------------- extern double PipTavolsag = 0.0005; extern int Perc=10; extern double Lot=0.1; int Probalkozas = 5; int Min=MarketInfo(Symbol(),MODE_STOPLEVEL); int Buy_Ticket, Sell_Ticket; double Par_1_Buy= NormalizeDouble(Ask+Min*Point,Digits); double Par_1_Sell = NormalizeDouble(Bid,Digits); double BuyTavolsag = NormalizeDouble(Par_1_Buy+PipTavolsag,Digits); double SellTavolsag = NormalizeDouble(Par_1_Sell-PipTavolsag,Digits); if(Perc==Minute()) { for (int i=1; i<=Probalkozas; i++) { if(Buy_Ticket==0||Buy_Ticket<0) { Buy_Ticket=OrderSend(Symbol(),OP_BUYSTOP,Lot,BuyTavolsag,0,0,0,”Magic szám : “,Buy_Magic,0,Green); } if(Sell_Ticket==0||Sell_Ticket<0) { Sell_Ticket=OrderSend(Symbol(),OP_SELLSTOP,Lot,SellTavolsag,0,0,0,”Magic szám : “,Sell_Magic,0,Red); } if (Buy_Ticket>0 && Sell_Ticket>0) { break; } if (Buy_Ticket<0) {Print("Hiba a Buy függő megbízás elhelyezésében : ",GetLastError());} if (Sell_Ticket<0) {Print("Hiba a Sell függő megbízás elhelyezésében : ",GetLastError());} } } if((Perc<Minute())||(Perc>Minute())){Sell_Ticket=0;Buy_Ticket=0;} //----------------------------------------------------------------------------------
Ha Buy megbízásnál az Ask-hoz adom hozzá a PipTavolsagot és kihagyom a minimum Stop Levelt akkor is működnie kellene nem? A lényeg az hogy Bid ár fölé szeretnék elhelyezni egy Buy függő megbízást a megadott PipTavolsagra tehát Ask+PipTavolsag.
Mit gondolsz?
Alakul, de a stop távolságot nem kell mindig hozzáadni a kívánt távolsághoz, mert úgy szimplán feleslegesen növeled a távolságaidat. Akkor ellenőrizd le a minimum távolságot, amikor megvan a kívánt ár, sl, tp, stb. – a korábban mutatott linken le vannak írva a képletek.
Tehát ha pl. BUY STOP megbízást akarsz kirakni az aktuális Ask ártól 20 pipre, akkor Ask + 0.0020 lesz a kívánt ár. Ekkor a nyitóár – Ask ár közötti különbségnek kell legalább stoplevel-nyi értéknek lennie. Ha ez nem teljesül, akkor add hozzá a stoplevelnyi távolságot az Ask árhoz, hiszen akkro a legközelebbi helyes értéket kapod.
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.