A megbízások módosítása
Az MQL4 lehetővé teszi a piaci és a függőben levő megbízások módosítását. A megbízásokat azon szabályok szerint módosíthatjuk, amelyeket a Megbízások jellemzői és a Követelmények és korlátozások a kereskedelemben fejezetekben leírtunk.
OrderModify() függvény
Az OrderModify() függvény segítségével piaci és függőben levő megbízásokat módosíthatunk.
bool OrderModify(int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)
A függvény módosítja a piaci és függőben levő megbízások paramétereit. A függvény visszaküldi a TRUE értéket, ha a kérést sikeresen végrehajtotta. Különben a FALSE-ot küldi vissza.
Paraméterek:
ticket - a megbízás egyedi azonosító száma.
price - egy függőben levő megbízás újonnan kért ára, vagy a megbízás nyitó ára.
stoploss - a StopLoss új értéke.
takeprofit – a TakeProfit új értéke.
expiration - függőben levő megbízás lejárati ideje.
arrow_color - a módosított StopLoss és/vagy TakeProfit nyilak színe az ábrán. Ha ez a paraméter hozzáférhetetlen vagy az értéke CLR_NONE, a nyilakat nem fogják mutatni az ábrán.
Megjegyzés: Csak a függőben levő megbízások esetén tudod a nyitó árat és a lejáratot megváltoztatni.
Ha a függvényparaméterekként változatlan értékeket adsz meg, a terminál 1. hibakódot fog visszaküldeni (ERR_NO_RESULT). Van olyan szerver, ahol nem lehetséges a függőben levő megbízások lejárat idejét megadni. Ebben az esetben, ha megpróbálsz egy nem nullaértékű lejárati paramétert létrehozni, a 147. hibakódot (ERR_TRADE_EXPIRATION_DENIED) kapod válaszul.
A megbízások módosítása
Egy általános megbízás két stopmegbízást tartalmaz - StopLoss és TakeProfit. Ezek utasítást adnak a megbízás zárására adott árakon, azért hogy korlátozzuk a veszteséget és realizáljuk a profitot. A tőzsdei megbízások módosítása hasznos lehet akkor, ha meg kell változtatni a stop megbízások kért árait egy új értékre, a program vagy a kereskedő kezdeményezésére. Az ügyfélterminálnak van saját eszköze a StopLoss módosítására: a követő stop. Ez lehetővé teszi a programnak, hogy módosítsa a StopLoss szintjét, és az kövesse az aktuális árat egy bizonyos rögzített távolsággal. (lásd MetaTrader 4 Client Terminal User Guide-ot).
Az OrderModify() megbízás-módosító függvény jelentősen kiterjeszti a módosítás lehetőségét: Mindkét stop megbízás kért árait megváltoztathatjuk vagy törölhetjük a piaci ár függvényében. A megbízások módosítását korlátozza a stop megbízások és a piaci ár közötti minimális megengedett távolság, amit a dealing center beállított . (lásd: Megbízások jellemzői és a Követelmények és korlátozások a kereskedelemben).Ha a program megpróbál megváltoztatni egy stop pozíciót, egy olyan értékre, ami a megengedett minimális távolságnál közelebb van a piaci árhoz, az ilyen kereskedelmi kérés vissza fogja utasítani az ügyfélterminál és az OrderModify() függvényt nem hajtja végre, (130. hiba). Ezért a programba be kell építeni egy olyan blokkot, ami meg fogja vizsgálni ezt a korlátozást.
Példa
Példa egy egyszerű Expert Advisorra, ami módosítja StopLoss megbízást, ha a távolság a StopLoss kért ára és a piaci ár között nagyobb, mint az előre beállított érték (modifystoploss.mq4)
//------------------------------------------------------------------------------------
// modifystoploss.mq4
// The code should be used for educational purpose only.
//------------------------------------------------------------------------------------
extern int Tral_Stop=10; // Trailing distance
//------------------------------------------------------------------------------- 1 --
int start() // Special function 'start'
{
string Symb=Symbol(); // Symbol
//------------------------------------------------------------------------------- 2 --
for(int i=1; i<=OrdersTotal(); i++) // Cycle searching in orders
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // If the next is available
{ // Analysis of orders:
int Tip=OrderType(); // Order type
if(OrderSymbol()!=Symb||Tip>1)continue;// The order is not "ours"
double SL=OrderStopLoss(); // SL of the selected order
//---------------------------------------------------------------------- 3 --
while(true) // Modification cycle
{
double TS=Tral_Stop; // Initial value
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Min. distance
if (TS < Min_Dist) // If less than allowed
TS=Min_Dist; // New value of TS
//------------------------------------------------------------------- 4 --
bool Modify=false; // Not to be modified
switch(Tip) // By order type
{
case 0 : // Order Buy
if (NormalizeDouble(SL,Digits)< // If it is lower than we want
NormalizeDouble(Bid-TS*Point,Digits))
{
SL=Bid-TS*Point; // then modify it
string Text="Buy "; // Text for Buy
Modify=true; // To be modified
}
break; // Exit 'switch'
case 1 : // Order Sell
if (NormalizeDouble(SL,Digits)> // If it is higher than we want
NormalizeDouble(Ask+TS*Point,Digits)
|| NormalizeDouble(SL,Digits)==0)//or equal to zero
{
SL=Ask+TS*Point; // then modify it
Text="Sell "; // Text for Sell
Modify=true; // To be modified
}
} // End of 'switch'
if (Modify==false) // If it is not modified
break; // Exit 'while'
//------------------------------------------------------------------- 5 --
double TP =OrderTakeProfit(); // TP of the selected order
double Price =OrderOpenPrice(); // Price of the selected order
int Ticket=OrderTicket(); // Ticket of the selected order
Alert ("Modification ",Text,Ticket,". Awaiting response..");
bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Modify it!
//------------------------------------------------------------------- 6 --
if (Ans==true) // Got it! :)
{
Alert ("Order ",Text,Ticket," is modified:)");
break; // From modification cycle.
}
//------------------------------------------------------------------- 7 --
int Error=GetLastError(); // Failed :(
switch(Error) // Overcomable errors
{
case 130:Alert("Wrong stops. Retrying.");
RefreshRates(); // Update data
continue; // At the next iteration
case 136:Alert("No prices. Waiting for a new tick..");
while(RefreshRates()==false) // To the new tick
Sleep(1); // Cycle delay
continue; // At the next iteration
case 146:Alert("Trading subsystem is busy. Retrying ");
Sleep(500); // Simple solution
RefreshRates(); // Update data
continue; // At the next iteration
// Critical errors
case 2 : Alert("Common error.");
break; // Exit 'switch'
case 5 : Alert("Old version of the client terminal.");
break; // Exit 'switch'
case 64: Alert("Account is blocked.");
break; // Exit 'switch'
case 133:Alert("Trading is prohibited");
break; // Exit 'switch'
default: Alert("Occurred error ",Error);//Other errors
}
break; // From modification cycle
} // End of modification cycle
//---------------------------------------------------------------------- 8 --
} // End of order analysis
} // End of order search
//------------------------------------------------------------------------------- 9 --
return; // Exit start()
}
//------------------------------------------------------------------------------ 10 --
A fenti program egy Expert Advisor. Ha szükséges, könnyen meg tudod valósítani a megbízás módosító függvényt egy scriptben. Azonban, nem célszerű scriptet használni erre a feladatra, mert a script befejezné a munkáját, miután a kereskedelmi kérést végrehajtotta. Egy script használata csak egy olyan programban célszerű, ami egy egyszeri műveletet hajt végre, mint például egy megbízás kinyitás vagy bezárása. Ebben az esetben egy olyan feladatot kell megoldanunk, ahol folytonos irányításra van szükség: változtasd meg egy stop megbízás pozícióját, ha egy bizonyos feltétel teljesül, mégpedig ha a távolság a piaci ár és a stop megbízás értéke között meghalad egy bizonyos előre beállított értéket (ebben az esetben ez 10 pont). Folyamatos használatra sokkal kényelmesebb írni egy EA-t ami minden ticknél végrehajtódik a felhasználó közvetlen ellenőrzése nélkül.
A fenti modifystoploss.mq4 EA algoritmusa nagyon egyszerű. A fő számításokat a megbízás kereső ciklusban végezzük (2-9 blokk). A megkeressük a nyitott megbízásokat, a piaci és függőben lévő megbízásokat is (az OrderSelect() függvényhívásban a 'pool' paraméter nincs megadva). A 2-3 blokkban a függőben levő megbízásokat, és a másik szimbólumokon nyitott megbízásokat szűrjük ki; a szűrés után maradt megbízások StopLoss értékét manipuláljuk.A3-9 blokk tartalmazza azt a ciklust, ami módosítja a kiválasztott megbízás stop értékét. A 3-4 blokkban a minimális távolság új értékét határozzuk meg (a bróker bármelyik pillanatban meg tudja változtatni ezt az értéket). A 4-5 blokkban a megvizsgáljuk, hogy szükséges-e módosítani a kiválasztott megbízást (a 'for' ciklusban) és, ha igen akkor a StopLoss új értékét is kiszámoljuk. Ha az aktuális megbízást nem kell módosítani, a program kilép a 'while' ciklusból a 4-5 blokk végén és a megbízás nem lesz módosítva (az 5-6 blokkban). Azonban, ha a megbízásnak szüksége van a módosításra, a vezérlést átadjuk az 5-6 blokkba, ahol az OrderModify()függvény szükséges paramétereit kiszámoljuk és azokkal kialakítunk egy kereskedelmi kérést.
Ha a kereskedelmi kérést sikeresen végrehajtottunk, a 'break' operátor a 6-7 blokkban be fogja fejezni a 'while' ciklus végrehajtását, és ezzel a megbízás kereső ciklus aktuális ismétlése is véget ér (a következő megbízás feldolgozására elkezdődik a következő ismétlés). Ha a kereskedelmi kérést nem sikerül végrehajtani, a hibákat fel kell dolgozni. Ha egy hibáról kiderül, hogy nem kritikus a program újra próbálkozik a kérés végrehajtásával. Ha a hiba kritikus hiba, a vezérlés a módosítás cikluson kívül kerül a következő megbízás feldolgozására (a 'for' ciklusban).
Meg kell jegyezned a megbízások módosításának még egy jellemzőjét. Az OrderModify() függvény egyidejűleg a stop megbízás mindkét új értékeit beállítja. Azonban, a minimum távolság értékét csak annál a stop megbízásnál kell betartani, amelyiknek az értéke megváltozik. Ha az új érték az aktuális értékkel azonos marad, a stop megbízás a piaci ártól bármilyen távolságra lehet, az ilyen kereskedelmi kérés helyes.
Például nekünk van egy Buy 1.2954 megbízásunk a következő stop megbízásokkal: StopLoss = 1.2948 és TakeProfit = 1.2960. A minimális távolság, amit beállított a bróker 5 pont. A Bid = 1.2959 piaci árnál, felmerül a megbízás módosításának szükségessége: StopLoss = 1.2949-re (Bid - 10 pont). Az OrderModify() függvény végrehajtsa során a TakeProfit új értékét szintén meg kell adni. Az EA-nk nem változtatja meg TakeProfit pozícióját, ezért a függvényben a TakeProfit = 1.2960 árfolyamértéket helyeztük el.
Annak ellenére, hogy a TakeProfit = 1.2960 értéke közel van a Bid piaci árhoz (csak 1 pont, ez kevesebb, mint az 5 pontmegengedett minimális távolság), de nem különbözik a jelenlegi TakeProfit = 1.2960 értékétől, a kérést a szerver végre fogja hajtani (a kérést visszautasíthatják, de más okból). 102. és 103. ábrákon követhetjük a sikeres módosítás eredményeit.
102. ábra. Riasztási ablak és
szimbólumablak a modifystoploss.mq4 EA
által végrehajtott
módosításokról.
103. ábra. Módosított
megbízás a Terminálban ablakban.
A 103. ábrán láthatjuk, hogy a módosítás a StopLoss = 1.2949 új értékével végződött, mikor az aktuális ár Bid = 1.2959 1 pont távolságra volt TakeProfit értékétől.
Meg kell jegyezni, hogy sem a piaci, sem a függőben levő megbízásokat nem kell módosítani a piaci helyzetelemzéstől függetlenül. Az ilyen módosítás csak akkor lehet hasznos, ha a piaci ár gyorsan mozog valamelyik irányban, ez megtörténhet fontos hírek után. Mindazonáltal, egy ”normális” piacon, a szükséges döntéseket a megbízások módosítására a piaci ismertetőjelek alapján kell elvégezni. A modifystoploss.mq4 Expert Advisorban szintén használunk egy ismertetőjelet (a StopLoss messzebb van a piaci ártól, mint mi akarjuk), ami alapján a program úgy dönt, hogy a megbízásokat módosítja. Azonban ez az ismertetőjel túl egyszerű és merev, hogy olyan ismertetőjelként alkalmazzuk, ami a piaci helyzetet jellemzi.
A függőben levő megbízások módosítása
A függőben levő megbízások módosítása kissé különbözik a piaci megbízásoktól. A fő különbség az, hogy a megbízás kért nyitó árát is meg lehet változtatni. Be kell tartanunk azokat a szabályokat, amelyek korlátozzák egy függőben levő megbízás pozícióját az aktuális ár és a kért nyitóár, valamint a kért nyitóár és a hozzá tartozó stop megbízások vonatkozásában (lásd: Megbízások jellemzői és a Követelmények és korlátozások a kereskedelemben). Ugyanakkor a módosított függőben levő megbízás minden jellemzőjét úgy vizsgáljuk, mintha új megbízás lenne, bármi is a módosítandó előző megbízás értéke. Például feltételezzük azt, hogy nekünk van egy függőben levő BuyStop = 1.2030 megbízásunk, StopLoss = 1.2025 és TakeProfit = 1.2035. A bróker 5 pontra állította be a minimális megengedett távolságot. Könnyű belátni, hogy a stop megbízások a megengedett sávon belül vannak, valamint a kért nyitó ár bármilyen módosítása a stop megbízások közül legalább egynek a szükséges módosításával fog végződni. Mindazonáltal, ha egy olyan kereskedelmi kérést küldünk, ahol a nyitó árat megváltoztatjuk, miközben a stop szintek változatlanok maradnak, az ügyfélterminál ezt a kérést rossznak fogja találni és nem küldi tovább a szervernek. Például, ha a kérés a következő értékeket tartalmazza: BuyStop = 1 2028, StopLoss = 1.2025 és TakeProfit = 1.2035, ez a kérés hibás lesz, bár a stop megbízás értékeit nem változtattuk meg: ebben az esetben, a kérés megszegi a minimális távolság szabályát a kért nyitó ár és valamelyik stop megbízás között (lásd: Követelmények és korlátozások a kereskedelemben).Lássuk, hogy hogyan nézhet ki az olyan script, ami megváltoztat egy függőben levő megbízást úgy, hogy a kért ára kövesse a piaci árat egy bizonyos előre definiált távolságra. Állítsuk be a távolságot 10 pontra! A módosítandó megbízás kiválasztásához (több függőben levő megbízás is lehet az ablakban) használjuk azt az árat aminél a scriptet hozzáerősítettük a szimbólumablakhoz.
Példa
Példa egy egyszerű scriptre, ami módosítja azt a függőben levő megbízást, amelyik nyitó ára a legközelebb van a script csatolási árához (modifyorderprice.mq4).
//------------------------------------------------------------------------------------
// modifyorderprice.mq4
// The code should be used for educational purpose only.
//------------------------------------------------------------------------------- 1 --
int start() // Special function 'start'
{
int Tral=10; // Approaching distance
string Symb=Symbol(); // Symbol
double Dist=1000000.0; // Presetting
double Win_Price=WindowPriceOnDropped(); // The script is dropped here
//------------------------------------------------------------------------------- 2 --
for(int i=1; i<=OrdersTotal(); i++) // Cycle searching in orders
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // If the next is available
{ // Analysis of orders:
//---------------------------------------------------------------------- 3 --
if (OrderSymbol()!= Symb) continue; // The symbol is not "ours"
if (OrderType()<2) continue; // Market order
//---------------------------------------------------------------------- 4 --
if(NormalizeDouble(MathAbs(OrderOpenPrice()-Win_Price),Digits)
< NormalizeDouble(Dist,Digits)) // Select the nearest one
{
Dist=MathAbs(OrderOpenPrice()-Win_Price);// New value
int Tip =OrderType(); // Type of the selected order.
int Ticket=OrderTicket(); // Ticket of the selected order
double Price =OrderOpenPrice(); // Цена выбранн. орд.
double SL =OrderStopLoss(); // SL of the selected order
double TP =OrderTakeProfit(); // TP of the selected order
} // End of 'if'
} // End of order analysis
} // End of order search
//------------------------------------------------------------------------------- 5 --
if (Tip==0) // If there are no pending orders
{
Alert("For ",Symb," no pending orders available");
return; // Exit the program
}
//------------------------------------------------------------------------------- 6 --
while(true) // Order closing cycle
{
RefreshRates(); // Update data
//------------------------------------------------------------------------- 7 --
double TS=Tral; // Initial value
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Min distance
if (TS < Min_Dist) // If less than allowed
TS=Min_Dist; // New value of TS
//------------------------------------------------------------------------- 8 --
string Text=""; // Not to be modified
double New_SL=0;
double New_TP=0;
switch(Tip) // By order type
{
case 2: // BuyLimit
if (NormalizeDouble(Price,Digits) < // If it is further than by
NormalizeDouble(Ask-TS*Point,Digits))//..the preset value
{
double New_Price=Ask-TS*Point; // Its new price
if (NormalizeDouble(SL,Digits)>0)
New_SL=New_Price-(Price-SL); // New StopLoss
if (NormalizeDouble(TP,Digits)>0)
New_TP=New_Price+(TP-Price); // New TakeProfit
Text= "BuyLimit "; // Modify it.
}
break; // Exit 'switch'
case 3: // SellLimit
if (NormalizeDouble(Price,Digits) > // If it is further than by
NormalizeDouble(Bid+TS*Point,Digits))//..the preset value
{
New_Price=Bid+TS*Point; // Its new price
if (NormalizeDouble(SL,Digits)>0)
New_SL=New_Price+(SL-Price); // New StopLoss
if (NormalizeDouble(TP,Digits)>0)
New_TP=New_Price-(Price-TP); // New TakeProfit
Text= "SellLimit "; // Modify it.
}
break; // Exit 'switch'
case 4: // BuyStopt
if (NormalizeDouble(Price,Digits) > // If it is further than by
NormalizeDouble(Ask+TS*Point,Digits))//..the preset value
{
New_Price=Ask+TS*Point; // Its new price
if (NormalizeDouble(SL,Digits)>0)
New_SL=New_Price-(Price-SL); // New StopLoss
if (NormalizeDouble(TP,Digits)>0)
New_TP=New_Price+(TP-Price); // New TakeProfit
Text= "BuyStopt "; // Modify it.
}
break; // Exit 'switch'
case 5: // SellStop
if (NormalizeDouble(Price,Digits) < // If it is further than by
NormalizeDouble(Bid-TS*Point,Digits))//..the preset value
{
New_Price=Bid-TS*Point; // Its new price
if (NormalizeDouble(SL,Digits)>0)
New_SL=New_Price+(SL-Price); // New StopLoss
if (NormalizeDouble(TP,Digits)>0)
New_TP=New_Price-(Price-TP); // New TakeProfit
Text= "SellStop "; // Modify it.
}
}
if (NormalizeDouble(New_SL,Digits)<0) // Checking SL
New_SL=0;
if (NormalizeDouble(New_TP,Digits)<0) // Checking TP
New_TP=0;
//------------------------------------------------------------------------- 9 --
if (Text=="") // If it is not modified
{
Alert("No conditions for modification.");
break; // Exit 'while'
}
//------------------------------------------------------------------------ 10 --
Alert ("Modification ",Text,Ticket,". Awaiting response..");
bool Ans=OrderModify(Ticket,New_Price,New_SL,New_TP,0);//Modify it!
//------------------------------------------------------------------------ 11 --
if (Ans==true) // Got it! :)
{
Alert ("Modified order ",Text," ",Ticket," :)");
break; // Exit the closing cycle
}
//------------------------------------------------------------------------ 12 --
int Error=GetLastError(); // Failed :(
switch(Error) // Overcomable errors
{
case 4: Alert("Trade server is busy. Retrying..");
Sleep(3000); // Simple solution
continue; // At the next iteration
case 137:Alert("Broker is busy. Retrying..");
Sleep(3000); // Simple solution
continue; // At the next iteration
case 146:Alert("Trading subsystem is busy. Retrying..");
Sleep(500); // Simple solution
continue; // At the next iteration
}
switch(Error) // Critical errors
{
case 2 : Alert("Common error.");
break; // Exit 'switch'
case 64: Alert("Account is blocked.");
break; // Exit 'switch'
case 133:Alert("Trading is prohibited");
break; // Exit 'switch'
case 139:Alert("Order is blocked and is being processed");
break; // Exit 'switch'
case 145:Alert("Modification prohibited. ",
"Order is too close to the market");
break; // Exit 'switch'
default: Alert("Occurred error ",Error);//Other alternatives
}
break; // Exit the closing cycle
} // End of closing cycle
//------------------------------------------------------------------------------ 13 --
Alert ("The script has completed its operations -----------------------");
return; // Exit start()
}
//------------------------------------------------------------------------------ 14 --
A távolságot a piaci ár és a függőben levő megbízás kért ára között a Tral változó képviseli. A Win_Price változó tartalmazza azt ár értékét, aminél a scriptet hozzáerősítették a szimbólumablakhoz. A megbízás kereső ciklusban (2-5 blokk), a script csatolási árához legközelebbi megbízás jellemzői számoljuk ki. A 6-13 blokk a megbízás módosító ciklus. A 8-9. blokkban eldöntjük azt, hogy a kiválasztott megbízást kell-e módosítani. Ha szükséges a módosítás, a stop megbízások kért árának az új értékei itt számoljuk ki. A megbízás módosítását OrderModify() függvényben kérjük a 10-11 blokkban. A hibákat a 11-13 blokkban dolgozzuk föl.
A 8-9 blokk négy hasonló blokkból áll, ahol a megbízás típusától függően az új kérésben használt értékeket számoljuk ki. Itt négy közül a SellLimit megbízás számítási menetét találjuk:
case 3: // SellLimit
if (NormalizeDouble(Price,Digits) > // If it is further than by
NormalizeDouble(Bid+TS*Point,Digits))//..the preset value
{
New_Price=Bid+TS*Point; // Its new price
if (NormalizeDouble(SL,Digits)>0)
New_SL = New_Price+(SL-Price);// New StopLoss
if (NormalizeDouble(TP,Digits)>0)
New_TP = New_Price-(Price-TP);// New TakeProfit
Text= "SellLimit "; // Modify it
}
break; // Exit 'switch'
A megbízás új paramétereit csak akkor számoljuk ki, ha a 'Price' ár messzibb van az aktuális piaci Bid ártól mint a kívánt TS távolság. Ebben az esetben a vezérlés átkerül az 'if' operátor törzsére, hogy a New_Price új nyitási árat kiszámoljuk. A StopLoss és TakeProfit új értékeit is kiszámoljuk. A távolság a kért megbízás nyitó ára és a stop megbízások értékei között ugyanaz marad.
Például a SellLimit 1.2050-nél, a StopLoss = 1.2073 és a TakeProfit = 1 2030-nál van. Tételezzük fel azt, hogy a számítások alapján az új nyitó ár egyenlő 1.2040-nel. Ebben az esetben, a stop megbízások új értékei a következők lesznek: StopLoss = 1.2063, TakeProfit = 1 2020. A program végrehajtása során mind a három alapvető paramétert (nyitó ár, StopLoss és TakeProfit) egy egységként változtatjuk meg a köztük lévő távolság megtartása mellett.
A 8-9blokk végén, a stop megbízások új értékeinek negatív értékeit ellenőrzik. Ezt hasznos megvizsgálni, ha egy korábban elhelyezett (egy másik program által, vagy kézzel) stopmegbízás közel volt nullához, például: 1 ponttal nulla fölött. Ebben az esetben, ha az új megbízási ár több mint 1 pontot mozdul lefelé, a stop megbízások közül az egyiknek az új ára negatívvá fog válni. Ha ezt az érték tartalmazza egy kereskedelmi kérés a kérést visszautasítja az ügyfélterminál.
Rá kell mutatnunk az ilyen programok hátrányára – legyenek azok scriptek vagy Expert Advisorok. A modifyorderprice.mq4 program korlátozott döntési lehetőségekkel rendelkezik. A megbízások módosítása csak egy irányban történhet. Ezzel a programmal nem lehet a megbízásokat a piaci ár mozgásával ellentétes irányban módosítani. A stop megbízások egymástól független megváltoztatására szintén nincs lehetőség ebben a programban.A fenti korlátozás miatt a beavatkozási lehetőség behatárolt. Ebben a programban csak egy fajtadöntést hozhat a felhasználó – meghatározhatja a helyszínt, ahol a scriptet hozzáerősíti a szimbólumablakhoz. Miközben használja ezt a lehetőséget, a kereskedő meghatározza azt, hogy melyik megbízást akarja módosítani. Azonban ez a felhasználó összes beavatkozási lehetősége. Azért hogy hatékonyabb legyen, a felhasználónak szüksége van arra, hogy további eszközöket használjon amelyek lehetővé teszik, hogy hasson a megbízások más paramétereire is.
Ezeket a feladatokat hatékonyan megoldhatjuk az MQL4 használatával. Azonban erre a célra egy ”intellektuálisabb” algoritmust kell majd használni. Lehetséges egy olyan programot létrehozni, ami automatizálni fogja a kereskedelmedet és az elképzeléseiddel összhangban fogja a megbízásokat módosítani. Egy ilyen programban további eszközöket használhatsz a manuális kereskedéshez is.