//+------------------------------------------------------------------+ //| Visual_Handle_Tranning.mq4 | //+------------------------------------------------------------------+ //| b - îòêðûòü ïîçèöèþ Buy; | //| s - îòêðûòü ïîçèöèþ Sell; | //| "ñòðåëêà ââåðõ" - çàêðûòü âñå BUY; | //| "ñòðåëêà âíèç" - çàêðûòü âñå SELL; | //| t - âêëþ÷àåò òðåéëèíã ñòîï îáùèé; | //| r - âûêëþ÷àåò òðåéëèíã ñòîï; | //| d - óäàëåíèå âñåõ îòëîæåííûõ îðäåðîâ. | //| Äëÿ âûñòàâëåíèÿ îòëîæåííîãî îðäåðà ìûøêîé âûáèðàåì èç ìåíþ | //| çíà÷êîâ "Ñòðåëî÷êó ââåðõ" äëÿ Buy-åâ è ùåëêàåì â òîì ìåñòå, | //| ãäå ïëàíèðóåì ïîñòàâèòü îðäåð. Åñëè ùåëêíóòü âûøå öåíû, òî | //| áóäåò BuyStop, åñëè íèæå - áóäåò BuyLimit. | //| äëÿ Sell-îâ, ñîîòâåòñòâåííî, çíà÷åê "ñòðåëî÷êà âíèç". | //| Ìîäèôèêàöèÿ îòäåëüíûõ îðäåðîâ: | //| Äâîéíûì ùåë÷êîì ìûøè âûäåëÿåì íóæíûé íàì çíà÷åê-îðäåð | //| äàëåå, ùåëêàåì ïî íåìó ïðàâîé êëàâèøåé ìûøè | //| è âûáèðàåì ñâîéñòâà Arrow. | //| Äàëåå, ìåíÿåì â ïîëå "Îïèñàíèå" íóæíûå ïàðàìåòðû îòäåëüíîãî | //| îðäåðà. | //| Ìîæíî ìåíÿòü SL, TP, à òàêæå çàêðûòü ðûíî÷íûé îðäåð | //| èëè óäàëèòü îòëîæåííûé Âìåñòî EMPTY ïèøåì close èëè del | //| ÂÀÆÍÎ ñîõðàíèòü ïðîáåëû - ýòî ðàçäåëèòåëè !!! | //| Ôîðìàò ïîëÿ "Îïèñàíèå", ðàçäåëèòåëü-"ÏÐÎÁÅË!!!": | //| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | | //| Price= 1.2565 SL= 1.2765 TP= 1.2265 Êîìàíäà= close | //| | | | | | | | | | | //| Êîìàíäà íà çàêðûòèå ðûíî÷íîãî îðäåðà - close | //| Óäàëåíèå îòëîæåííîãî - del | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, klot" #property link "klot@mail.ru" #define MAGICEXP 00000001 //---- #include <stdlib.mqh> #include <WinUser32.mqh> //---- #import "IdleLib.dll" int GetLastKeyWP(); int GetLastMouseWP(); int IdleLibInit(); int IdleLibUnInit(); string GetActiveWndName(); #import //---- extern double Lots = 0.1; extern double TrailingStop = 15.0; //---- static datetime lastsd; static int tral = 0; //color clModifyBuy = Aqua; //color clModifySell = Magenta; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { // èíèöèàëèçèðóåì Dll äëÿ ïåðåõâàòà ñîáûòèé IdleLibInit(); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { // äåèíèöèàëèçèðóåì Dll äëÿ ïåðåõâàòà ñîáûòèé IdleLibUnInit(); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if(IsDllsAllowed() == false) { Print("Âûçîâ DLL-ôóíêöèé èç áèáëèîòåê íåâîçìîæåí. Ýêñïåðò íå ìîæåò âûïîëíÿòüñÿ."); return(0); } if(IsLibrariesAllowed() == false) { Print("Áèáëèîòå÷íûå âûçîâû çàïðåùåíû. Ýêñïåðò íå ìîæåò âûïîëíÿòüñÿ."); return(0); } if(!IsTesting()) { Print("Ýêñïåðò çàïóùåí íå â ðåæèìå òåñòèðîâàíèÿ"); return(0); } if(IsOptimization()) { Print("Ýêñïåðò çàïóùåí â ðåæèìå îïòèìèçàöèè"); return(0); } // óñòðàíåíèå äðåáåçãà êëàâèø static int trigger = 0; // Îïðàøèâàåì êîä ïîñëåäíåé íàæàòîé êëàâèøè int lastkey = GetLastKeyWP(); // Èìÿ îêíà Metatrader, ãäå ïðîèçîøëî ñîáûòèå string lastwnd = GetActiveWndName(); //---- if((lastkey != 0) && (lastwnd != "")) { //óñòðàíåíèå äðåáåçãà êëàâèø if(trigger != lastkey) trigger = lastkey; else { lastkey = 0; trigger = 0; } //--- switch(lastkey) { case 66: buy_open(0, 0); break; case 83: sell_open(0, 0); break; case 38: close_order(1); break; case 40: close_order(-1); break; case 84: if(tral == 0) tral = 1; Comment("Tralling âêëþ÷åí = ", TrailingStop); break; case 82: if(tral == 1 ) tral = 0; Comment("Tralling âûêëþ÷åí"); break; case 68: delete_pending_all(); break; //case ..: ìîæíî ïðèäóìàòü ëþáóþ ñîáñòâåííþ ôè÷ó default : break; } } send_pending(); managers_market_orders(); //---- if(lastkey != 0) Print(" "+lastkey); //---- return(0); } //+------------------------------------------------------------------+ //| Óïðàâëåíèå ðûíî÷íûìè îðäåðàìè (èçìåíåíèå SL,TP,price) | //| Âñå ïèñàòü â Ñâîéñòâàõ Arrow, â ïîëå "Îïèñàíèå" | //| Ôîðìàò ïîëÿ "Îïèñàíèå", ðàçäåëèòåëü-"ÏÐÎÁÅË!!!": | //| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | | //| Price= 1.2565 SL= 1.2765 TP= 1.2265 Êîìàíäà= close | //| | | | | | | | | | | //| Êîìàíäà íà çàêðûòèå ðûíî÷íîãî îðäåðà - close | //| Óäàëåíèå îòëîæåííîãî - del | //| //+------------------------------------------------------------------+ void managers_market_orders() { string desc, name, exec, _EMPTY = "EMPTY"; string array_param[]; int count, arrow_code, ticket, pos, nGetLastError; double price, sl, tp; int TrailingStep = 5; int obj_total = ObjectsTotal(); //---- if(obj_total == 0) return; //---- for(int i = obj_total - 1; i >= 0; i--) { name = ObjectName(i); //---- if(ObjectType(name) != OBJ_ARROW) continue; arrow_code = ObjectGet(name, OBJPROP_ARROWCODE); if(arrow_code != 1 && arrow_code != 2) continue; else { //Âû÷èñëÿåì òèêåò îðäåðà ïî çíà÷êó Arrow pos = StringFind(name, " ", 0); ticket = StrToInteger(StringSubstr(name, 1, pos)); //Print("ticket= ",ticket); //--- if(OrderSelect(ticket, SELECT_BY_TICKET) == true) { if(OrderCloseTime()!=0) continue; //×èòàåì ïîëå Îïèñàíèå â ñâîéñòâàõ Arrow desc = ObjectDescription(name); // Åñëè ñòðî÷êà ïóñòàÿ çàïîëíèì íà÷àëüíûìè çíà÷åíèÿìè if(StringLen(desc) == 0) { desc = StringConcatenate("Price= ", OrderOpenPrice(), " SL= ", OrderStopLoss(), " TP= ", OrderTakeProfit(), " Êîìàíäà= ",_EMPTY); ObjectSetText(name, desc); } // çàïîëíåíèå ìàññèâà ïàðàìåòðîâ îðäåðà count = StrSplit(desc, array_param, " "); if(count != 8) { desc = StringConcatenate("Price= ", OrderOpenPrice(), " SL= ", OrderStopLoss(), " TP= ", OrderTakeProfit(), " Êîìàíäà= ",_EMPTY); ObjectSetText(name, desc); Print(" Îøèáêà â ôîðìàòå ïîëÿ Îèñàíèå. Ïîëå âîñòàíîâëåíî!!!"); } else { price = StrToDouble(array_param[1]); sl = StrToDouble(array_param[3]); tp = StrToDouble(array_param[5]); exec = array_param[7]; } //--- if(OrderType()==OP_BUY) { if(TrailingStop > MarketInfo(Symbol(), MODE_STOPLEVEL) && tral == 1) { if(Bid - OrderOpenPrice() > TrailingStop*Point) { if(OrderStopLoss() < Bid - (TrailingStop + TrailingStep - 1)*Point) { sl = Bid - TrailingStop*Point; desc = StringConcatenate("Price= ", OrderOpenPrice(), " SL= ", sl, " TP= ", OrderTakeProfit(), " Êîìàíäà= ", _EMPTY); ObjectSetText(name, desc); } } } //--- if(sl != 0 && sl != OrderStopLoss()) ModifyStopLoss(sl); if(tp != 0 && tp != OrderTakeProfit()) ModifyTakeProfit(tp); //--- if(exec == "close") { RefreshRates(); OrderClose(OrderTicket(), OrderLots(), Bid, 3, Aqua); nGetLastError = GetLastError(); if(nGetLastError != 0) Print("Error closing BUY order : ", ErrorDescription(nGetLastError)); } } if(OrderType() == OP_SELL) { if(TrailingStop > MarketInfo(Symbol(), MODE_STOPLEVEL) && tral == 1) { if(OrderOpenPrice() - Ask > TrailingStop*Point) { if(OrderStopLoss() > Ask + (TrailingStop + TrailingStep - 1)*Point || OrderStopLoss() == 0) { sl = Ask + TrailingStop*Point; desc = StringConcatenate("Price= ", OrderOpenPrice(), " SL= ", sl, " TP= ", OrderTakeProfit(), " Êîìàíäà= ",_EMPTY); ObjectSetText(name, desc); } } } //--- if(sl != 0 && sl != OrderStopLoss()) ModifyStopLoss(sl); if(tp != 0 && tp != OrderTakeProfit()) ModifyTakeProfit(tp); //--- if(exec=="close") { RefreshRates(); OrderClose(OrderTicket(), OrderLots(), Ask, 3, Yellow); nGetLastError = GetLastError(); if(nGetLastError != 0) Print("Error closing SELL order : ", ErrorDescription(nGetLastError)); } } if(OrderType() == OP_SELLLIMIT || OrderType() == OP_BUYLIMIT || OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) { // åñëè ìûøêîé ïåðåìåñòèëè îðäåð if(NormalizeDouble(ObjectGet(name, OBJPROP_PRICE1), Digits) != price) { price = NormalizeDouble(ObjectGet(name, OBJPROP_PRICE1), Digits); desc = StringConcatenate("Price= ", price, " SL= ", OrderStopLoss(), " TP= ", OrderTakeProfit(), " Êîìàíäà= ", _EMPTY); ObjectSetText(name, desc); } //--- if(price != OrderOpenPrice() && MathAbs(price - Ask) > (MarketInfo(Symbol(), MODE_STOPLEVEL)*Point) ) { OrderModify(OrderTicket(), price, OrderStopLoss(), OrderTakeProfit(), OrderExpiration(),CLR_NONE); nGetLastError = GetLastError(); if(nGetLastError != 0) Print("Error closing SELL order : ", ErrorDescription(nGetLastError)); else ObjectDelete(name); } //---- if(sl != 0 && sl != OrderStopLoss()) ModifyStopLoss(sl); if(tp != 0 && tp != OrderTakeProfit()) ModifyTakeProfit(tp); //---- if(exec == "del") { OrderDelete(OrderTicket()); nGetLastError = GetLastError(); if(nGetLastError != 0) Print("Error closing SELL order : ", ErrorDescription(nGetLastError)); } } } else Print("OrderSelect() âåðíóë îøèáêó - ", GetLastError()); } } } //+------------------------------------------------------------------+ //| Óñòàíîâêà îòëîæåííûõ îðäåðîâ | //| ïðîñòî ïåðåòàñêèâàåì çíà÷åê "ñòðåëî÷êà ââåðõ" íà ìåñòî, êóäà | //| õîòèì ïîñòàâèòü îòëîæåííûé îðäåð. Åñëè âûøå öåíû áóäåò ByuStop | //| åñëè íèæå öåíû - áóäåò BuyLimit. Äëÿ Sel-îâ - ñîîòâåòñòâåííî | //| çíà÷åê "ñòðåëî÷êà âíèç" | //+------------------------------------------------------------------+ void send_pending() { int arrow_code; string name; double price; int obj_total = ObjectsTotal(); //---- for(int i = 0; i < obj_total; i++) { name = ObjectName(i); if(ObjectType(name) != OBJ_ARROW) continue; arrow_code = ObjectGet(name, OBJPROP_ARROWCODE); if(arrow_code != 242 && arrow_code != 241) continue; //--- if(arrow_code == 242) { price = NormalizeDouble(ObjectGet(name, OBJPROP_PRICE1), Digits); if(price < Bid - (MarketInfo(Symbol(), MODE_STOPLEVEL)*Point)) { sellstop_open(price, 0, 0); ObjectDelete(name); } if(price > Ask + (MarketInfo(Symbol(), MODE_STOPLEVEL)*Point)) { selllimit_open(price, 0, 0); ObjectDelete(name); } } //--- if(arrow_code == 241) { price = NormalizeDouble(ObjectGet(name, OBJPROP_PRICE1), Digits); //---- if(price > Ask + (MarketInfo(Symbol(), MODE_STOPLEVEL)*Point)) { buystop_open(price, 0, 0); ObjectDelete(name); } if(price < Bid - (MarketInfo(Symbol(), MODE_STOPLEVEL)*Point)) { buylimit_open(price, 0, 0); ObjectDelete(name); } } } //---- return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void delete_pending_all() { bool result; int cmd, total; total = OrdersTotal(); //---- if(total == 0) return; //---- for(int i = total - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { cmd = OrderType(); //---- pending orders only are considered if(cmd != OP_BUY && cmd != OP_SELL) { //---- print selected order OrderPrint(); //---- delete first pending order result = OrderDelete(OrderTicket()); //---- if(result != TRUE) { Print("LastError = ", GetLastError()); break; } } } else { Print( "Error when order select ", GetLastError()); break; } } //---- return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void selllimit_open( double price, double SL=0, double TP=0 ) { int ticket, expiration; //---- expiration = CurTime() + PERIOD_D1*60; //---- ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, price, 0, SL, TP, "", MAGICEXP, expiration, Green); if(ticket <= 0) Print("Error = ", GetLastError()); else { Print("ticket = ", ticket); lastsd = CurTime(); } //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void sellstop_open( double price, double SL=0, double TP=0 ) { int ticket, expiration; //---- expiration = CurTime() + PERIOD_D1*60; //---- ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots,price, 0, SL, TP, "", MAGICEXP, expiration, Green); if(ticket <= 0) Print("Error = ", GetLastError()); else { Print("ticket = ", ticket); lastsd = CurTime(); } //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void buylimit_open(double price, double SL = 0, double TP = 0) { int ticket,expiration; //---- expiration = CurTime() + PERIOD_D1*60; //---- ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, price, 0, SL, TP, "", MAGICEXP, expiration, Green); if(ticket <= 0) Print("Error = ", GetLastError()); else { Print("ticket = ", ticket); lastsd = CurTime(); } //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void buystop_open(double price, double SL = 0, double TP = 0) { int ticket, expiration; //---- expiration = CurTime() + PERIOD_D1*60; //---- RefreshRates(); ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, price, 0, SL, TP, "", MAGICEXP, expiration,Green); if(ticket <= 0) Print("Error = ", GetLastError()); else { Print("ticket = ", ticket); lastsd = CurTime(); } //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void buy_open(double SL, double TP) { int ticket, lasterror; RefreshRates(); ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, 0, MAGICEXP, 0, Aqua); if(ticket > 0) { if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ", OrderOpenPrice()); lastsd = CurTime(); } else Print("Error opening BUY order : ", ErrorDescription(GetLastError())); return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void sell_open(double SL, double TP) { int ticket, lasterror; RefreshRates(); ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, 0, MAGICEXP, 0, Red); if(ticket > 0) { if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("Sell order opened : ", OrderOpenPrice()); lastsd=CurTime(); } else Print("Error opening Sell order : ", ErrorDescription(GetLastError())); return; } //+------------------------------------------------------------------+ //| Çàêðûòèå îðäåðîâ n=1 - çàêðûòü Buy, n=-1 - çàêðûòü Sell | //+------------------------------------------------------------------+ void close_order(int n = 0) { int nGetLastError; int nOrdersTotal = OrdersTotal(); //---- for(int i = nOrdersTotal - 1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); nGetLastError = GetLastError(); //---- if(nGetLastError != 0) { Print("Error selecting order : ", ErrorDescription(nGetLastError)); continue; } //---- if(OrderMagicNumber() != MAGICEXP || OrderSymbol() != Symbol()) continue; //---- check order type if(OrderType() == OP_BUY && n == 1) { RefreshRates(); OrderClose(OrderTicket(), OrderLots(), Bid, 3, Aqua); nGetLastError = GetLastError(); if(nGetLastError != 0) Print("Error closing BUY order : ", ErrorDescription(nGetLastError)); } //---- if(OrderType() == OP_SELL && n==-1) { RefreshRates(); OrderClose(OrderTicket(), OrderLots(), Ask, 3, Yellow); nGetLastError = GetLastError(); if(nGetLastError != 0) Print("Error closing SELL order : ", ErrorDescription(nGetLastError)); } } } //+------------------------------------------------------------------+ //| Ïåðåíîñ óðîâíÿ StopLoss "Copyright" © KimIV | //| Ïàðàìåòðû: | //| ldStopLoss - óðîâåíü StopLoss | //| clModify - öâåò ìîäèôèêàöèè | //+------------------------------------------------------------------+ void ModifyStopLoss(double ldStop, color clModify = Magenta ) { bool fm; double ldOpen = OrderOpenPrice(); double ldTake = OrderTakeProfit(); int err; //---- if(IsTradeAllowed()) { fm = OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, clModify); if(!fm) { err = GetLastError(); Print("Error(",err,") modifying SL: ", ErrorDescription(err)); } } } //+------------------------------------------------------------------+ //| Ïåðåíîñ óðîâíÿ TakeProfit | //| Ïàðàìåòðû: | //| ldTake - óðîâåíü TakeProfit | //| clModify - öâåò ìîäèôèêàöèè | //+------------------------------------------------------------------+ void ModifyTakeProfit(double ldTake, color clModify = Magenta ) { bool fm; double ldOpen = OrderOpenPrice(); double ldStop = OrderStopLoss(); int err; //---- if(IsTradeAllowed()) { fm = OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, clModify); if(!fm) { err = GetLastError(); Print("Error(",err,") modifying SL: ", ErrorDescription(err)); } } } //+------------------------------------------------------------------+ //| Ðàçáèåíèå ñòðîêè íà ìàññèâ ýëåìåíòîâ | //| Âîçâðàò: | //| Êîëè÷åñòâî ýëåìåíòîâ â ìàññèâå | //| Ïàðàìåòðû: | //| source - òåêñòîâàÿ ñòðîêà | //| dest - âûõîäíîé ìàññèâ | //| delimeter - ðàçäåëèòåëü | //+------------------------------------------------------------------+ int StrSplit(string source, string& dest[], string delimeter = ";") { int cnt = 0; int last_pos = 0; int pos = StringFind(source, delimeter, last_pos); //---- while(pos != -1) { ArrayResize(dest, cnt + 1); dest[cnt] = StringSubstr(source, last_pos, pos - last_pos); cnt++; last_pos = pos + 1; pos = StringFind(source, delimeter, last_pos); } if(last_pos != 0 && last_pos < StringLen(source)) { ArrayResize(dest, cnt + 1); dest[cnt] = StringSubstr(source, last_pos, StringLen(source) - last_pos); cnt++; } return (cnt); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
IdleLib
Order Management characteristics:
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy
Checks for the total of open orders
It automatically opens orders when conditions are reached
Other Features: