Orders Execution
0
Views
0
Downloads
0
Favorites
Visual_Handle_Tranning_51_4
//+------------------------------------------------------------------+
//| 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);
}
//+------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---