Orders Execution
0
Views
0
Downloads
0
Favorites
e-MoveSLTPbyMouse_v1
//+----------------------------------------------------------------------------+
//| e-MoveSLTPbyMouse.mq4 |
//| |
//| Êèì Èãîðü Â. aka KimIV |
//| http://www.kimiv.ru |
//| |
//+----------------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link "http://www.kimiv.ru"
//------- Âíåøíèå ïàðàìåòðû ñîâåòíèêà -----------------------------------------+
extern string _P_Expert="---------- Parameters of e-MoveSL&TPbyMouse";
extern int Language = 1; // ßçûê: 0-English, 1-Ðóññêèé
extern double IntUpdate = 0.371; // Èíòåðâàë îáíîâëåíèÿ â ñåêóíäàõ
extern bool PrintEnable = True; // Ðàçðåøèòü ïå÷àòü â æóðíàë
extern string _P_Graphics="---------- Parameters of Graphic Objects";
extern color StopColor = Red; // Öâåò ëèíèè óðîâíÿ StopLoss
extern int StopStyle = 3; // Ñòèëü ëèíèè óðîâíÿ StopLoss
extern int StopWidth = 0; // Òîëùèíà ëèíèè óðîâíÿ StopLoss
extern color TakeColor = Gold; // Öâåò ëèíèè óðîâíÿ TakeProfit
extern int TakeStyle = 3; // Ñòèëü ëèíèè óðîâíÿ TakeProfit
extern int TakeWidth = 0; // Òîëùèíà ëèíèè óðîâíÿ TakeProfit
//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà -------------------------------------+
int Slippage = 3; // Ïðîñêàëüçûâàíèå öåíû
color clModifyBuy = Aqua; // Öâåò çíà÷êà ìîäèôèêàöèè ïîêóïêè
color clModifySell = Tomato; // Öâåò çíà÷êà ìîäèôèêàöèè ïðîäàæè
color clCloseBuy = Blue; // Öâåò çíà÷êà çàêðûòèÿ ïîêóïêè
color clCloseSell = Red; // Öâåò çíà÷êà çàêðûòèÿ ïðîäàæè
string msg[4][2];
//------- Ïîäêëþ÷åíèå âíåøíèõ ìîäóëåé -----------------------------------------+
#include <stdlib.mqh> // Ñòàíäàðòíàÿ áèáëèîòåêà
//+----------------------------------------------------------------------------+
//| |
//| ÏÐÅÄÎÏÐÅÄÅ˨ÍÍÛÅ ÔÓÍÊÖÈÈ |
//| |
//+----------------------------------------------------------------------------+
//| expert initialization function |
//+----------------------------------------------------------------------------+
void init()
{
msg[0][0]="Adviser will is started by next tick";
msg[0][1]="Ñîâåòíèê áóäåò çàïóùåí ñëåäóþùèì òèêîì";
msg[1][0]="Button is not pressed \"Enable experts for running\"";
msg[1][1]="Îòæàòà êíîïêà \"Ðàçðåøèòü çàïóñê ñîâåòíèêîâ\"";
msg[2][0]="IS ABSENT relationship with trade server\n"+
"Adviser is STOPPED";
msg[2][1]="ÎÒÑÓÒÑÒÂÓÅÒ ñâÿçü ñ òîðãîâûì ñåðâåðîì\n"+
"Ñîâåòíèê ÎÑÒÀÍÎÂËÅÍ";
msg[3][0]="Button is not pressed \"Enable experts for running\"\n"+
"Expert Adviser is STOPPED";
msg[3][1]="Îòæàòà êíîïêà \"Ðàçðåøèòü çàïóñê ñîâåòíèêîâ\"\n"+
"Ñîâåòíèê ÎÑÒÀÍÎÂËÅÍ";
if(Language<0 || Language>1) Message("Language is invalid");
if(IsExpertEnabled())
{
if(IntUpdate>0) start();
else Message(msg[0][Language]);
}
else Message(msg[1][Language]);
}
//+----------------------------------------------------------------------------+
//| expert deinitialization function |
//+----------------------------------------------------------------------------+
void deinit()
{
int i,k=ObjectsTotal();
string on;
// óäàëåíèå ëèíèé
for(i=0; i<k; i++)
{
on=ObjectName(i);
if(StringSubstr(on, 0, 2)=="sl") ObjectDelete(on);
if(StringSubstr(on, 0, 2)=="tp") ObjectDelete(on);
}
Comment("");
}
//+----------------------------------------------------------------------------+
//| expert start function |
//+----------------------------------------------------------------------------+
void start()
{
if(IntUpdate<=0) ManageLines();
else
{
while(IsExpertEnabled() && !IsStopped())
{
if(IsConnected()) ManageLines();
else { Comment(msg[2][Language]); return; }
Sleep(1000*IntUpdate);
}
Message(msg[3][Language]);
}
}
//+----------------------------------------------------------------------------+
//| |
//| ÏÎËÜÇÎÂÀÒÅËÜÑÊÈÅ ÔÓÍÊÖÈÈ |
//| |
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 01.09.2005 |
//| Îïèñàíèå : Âûïîëíÿåò ïîèñê ýëåìåíòà ìàññèâà ïî çíà÷åíèþ |
//| è âîçâðàùàåò èíäåêñ íàéäåííîãî ýëåìåíòà èëè -1. |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| m - ìàññèâ ýëåìåíòîâ |
//| e - çíà÷åíèå ýëåìåíòà |
//+----------------------------------------------------------------------------+
int ArraySearchInt(int& m[], int e)
{
for(int i=0; i<ArraySize(m); i++)
{
if(m[i]==e) return(i);
}
return(-1);
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 19.02.2008 |
//| Îïèñàíèå: Çàêðûòèå îäíîé ïðåäâàðèòåëüíî âûáðàííîé ïîçèöèè |
//+----------------------------------------------------------------------------+
void ClosePosBySelect()
{
bool fc;
color clClose;
double ll,pa,pb,pp;
int dg=MarketInfo(OrderSymbol(),MODE_DIGITS),err,it;
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
{
Print("ClosePosBySelect(): Îñòàíîâêà ðàáîòû ôóíêöèè");
}
while(!IsTradeAllowed()) Sleep(5000);
RefreshRates();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
if(OrderType()==OP_BUY)
{
pp=pb; clClose=clCloseBuy;
} else {
pp=pa; clClose=clCloseSell;
}
ll=OrderLots();
pp=NormalizeDouble(pp, dg);
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
if(!fc)
{
err=GetLastError();
if(err==146) while(IsTradeContextBusy()) Sleep(1000*11);
Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Sleep(1000*5);
}
}
else Print("Íåêîððåêòíàÿ òîðãîâàÿ îïåðàöèÿ. Close ",GetNameOP(OrderType()));
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 30.03.2008 |
//| Îïèñàíèå : Ïðîðèñîâêà ãîðèçîíòàëüíîé ëèíèè |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| cl - öâåò ëèíèè |
//| nm - íàèìåíîâàíèå ("" - âðåìÿ îòêðûòèÿ òåêóùåãî áàðà) |
//| p1 - öåíîâîé óðîâåíü (0 - Bid) |
//| st - ñòèëü ëèíèè (0 - ïðîñòàÿ ëèíèÿ) |
//| wd - øèðèíà ëèíèè (0 - ïî óìîë÷àíèþ) |
//+----------------------------------------------------------------------------+
void DrawHLine(color cl,string nm="",double p1=0,int st=0,int wd=0)
{
if(p1==0) p1=Bid;
if(ObjectFind(nm)<0)
{
ObjectCreate(nm,OBJ_HLINE,0,0,0);
ObjectSet(nm,OBJPROP_PRICE1,p1);
ObjectSet(nm,OBJPROP_COLOR,cl);
ObjectSet(nm,OBJPROP_STYLE,st);
ObjectSet(nm,OBJPROP_WIDTH,wd);
}
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 01.09.2005 |
//| Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè |
//+----------------------------------------------------------------------------+
string GetNameOP(int op)
{
switch(op)
{
case OP_BUY : return("Buy");
case OP_SELL : return("Sell");
case OP_BUYLIMIT : return("Buy Limit");
case OP_SELLLIMIT: return("Sell Limit");
case OP_BUYSTOP : return("Buy Stop");
case OP_SELLSTOP : return("Sell Stop");
default : return("Unknown Operation");
}
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 01.02.2008 |
//| Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ. |
//+----------------------------------------------------------------------------+
string IIFs(bool condition,string ifTrue,string ifFalse)
{
if(condition) return(ifTrue); else return(ifFalse);
}
//+----------------------------------------------------------------------------+
//| Óïðàâëåíèå ëèíèÿìè |
//+----------------------------------------------------------------------------+
void ManageLines()
{
double ms=MarketInfo(Symbol(), MODE_STOPLEVEL);
double ts=MarketInfo(Symbol(), MODE_TICKSIZE);
double pp; // öåíîâîé óðîâåíü StopLoss/TakeProfit
double np; // íåíîðìèðîâàííûé öåíîâîé óðîâåíü StopLoss/TakeProfit
int i, k; // ñ÷¸ò÷èê è êîëè÷åñòâî îáúåêòîâ/îðäåðîâ
int r; // òèêåò èñêîìîé ïîçèöèè
int t[]; // ìàññèâ òèêåòîâ ñóùåñòâóþùèõ ïîçèöèé
string on; // íàèìåíîâàíèå îáúåêòà
string st; // ñòðîêà êîììåíòàðèÿ
// çàïîëíåíèå ìàññèâà òèêåòîâ ñóùåñòâóþùèõ ïîçèöèé
ArrayResize(t,0);
k=OrdersTotal();
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY|| OrderType()==OP_SELL)
{
if(OrderStopLoss()>0 || OrderTakeProfit()>0)
{
r=ArraySize(t);
ArrayResize(t,r+1);
t[r]=OrderTicket();
}
}
}
}
}
// óäàëåíèå ëèøíèõ (íåíóæíûõ) ëèíèé, ìîäèôèêàöèÿ óðîâíåé
k=ObjectsTotal();
for(i=0; i<k; i++)
{
on=ObjectName(i);
if(StringSubstr(on,0,2)=="sl")
{
// òèêåò ïîçèöèè
r=StrToInteger(StringSubstr(on,2));
if(ArraySearchInt(t,r)<0) ObjectDelete(on);
else
{
if(OrderSelect(r,SELECT_BY_TICKET))
{
if(OrderStopLoss()>0)
{
np=NormalizeDouble(ObjectGet(on,OBJPROP_PRICE1),Digits);
if(ts>0) pp=NormalizeDouble(np/ts,0)*ts; else pp=np;
if(pp!=np) ModifyHLine(on,pp);
// 09.01.2013 if (OrderType()==OP_BUY && pp>Bid-(ms+1)*Point) pp=Bid-(ms+1)*Point;
// if (OrderType()==OP_SELL && pp<Ask+(ms+1)*Point) pp=Ask+(ms+1)*Point;
if(OrderType()==OP_BUY && pp>Bid-(ms+1)*Point) ClosePosBySelect();
if(OrderType()==OP_SELL && pp<Ask+(ms+1)*Point) ClosePosBySelect();
ModifyOrder(-1,NormalizeDouble(pp,Digits),-1);
}
else ObjectDelete(on);
}
}
}
if(StringSubstr(on,0,2)=="tp")
{
// òèêåò ïîçèöèè
r=StrToInteger(StringSubstr(on,2));
if(ArraySearchInt(t,r)<0) ObjectDelete(on);
else
{
if(OrderSelect(r,SELECT_BY_TICKET))
{
if(OrderTakeProfit()>0)
{
np=NormalizeDouble(ObjectGet(on,OBJPROP_PRICE1),Digits);
if(ts>0) pp=NormalizeDouble(np/ts,0)*ts; else pp=np;
if(pp!=np) ModifyHLine(on,pp);
// 09.01.2013 if (OrderType()==OP_BUY && pp<Bid+(ms+1)*Point) pp=Bid+(ms+1)*Point;
// if (OrderType()==OP_SELL && pp>Ask-(ms+1)*Point) pp=Ask-(ms+1)*Point;
if(OrderType()==OP_BUY && pp<Bid+(ms+1)*Point) ClosePosBySelect();
if(OrderType()==OP_SELL && pp>Ask-(ms+1)*Point) ClosePosBySelect();
ModifyOrder(-1,-1,NormalizeDouble(pp,Digits));
}
else ObjectDelete(on);
}
}
}
}
// óñòàíîâêà íåäîñòàþùèõ ëèíèé
k=OrdersTotal();
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(OrderStopLoss()>0)
{
DrawHLine(StopColor,"sl"+OrderTicket(),OrderStopLoss(),
StopStyle,StopWidth);
}
if(OrderTakeProfit()>0)
{
DrawHLine(TakeColor,"tp"+OrderTicket(),OrderTakeProfit(),
TakeStyle,TakeWidth);
}
}
}
}
}
st="Language="+IIFs(Language==0,"English","Ðóññêèé")
+" IntUpdate="+DoubleToStr(IntUpdate,4)
+" "+IIFs(PrintEnable,"PrintEnable","");
Comment(st);
}
//+----------------------------------------------------------------------------+
//| Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë |
//| Ïàðàìåòðû: |
//| m - òåêñò ñîîáùåíèÿ |
//+----------------------------------------------------------------------------+
void Message(string m)
{
Comment(m);
if(StringLen(m)>0 && PrintEnable) Print(m);
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 08.04.2008 |
//| Îïèñàíèå : Ìîäèôèêàöèÿ öåíîâîãî óðîâíÿ ãîðèçîíòàëüíîé ëèíèè |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| nm - íàèìåíîâàíèå ("" - âðåìÿ îòêðûòèÿ òåêóùåãî áàðà) |
//| p1 - öåíîâîé óðîâåíü (0 - Bid) |
//+----------------------------------------------------------------------------+
void ModifyHLine(string nm="",double p1=0)
{
if(p1==0) p1=Bid;
if(ObjectFind(nm)>=0) ObjectSet(nm,OBJPROP_PRICE1,p1);
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 28.03.2008 |
//| Îïèñàíèå : Ìîäèôèêàöèÿ îðäåðà. Âåðñèÿ ôóíêöèè äëÿ òåñòîâ íà èñòîðèè. |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| pp - öåíà îòêðûòèÿ ïîçèöèè, óñòàíîâêè îðäåðà |
//| sl - öåíîâîé óðîâåíü ñòîïà |
//| tp - öåíîâîé óðîâåíü òåéêà |
//| ex - äàòà èñòå÷åíèÿ |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1,double sl=0,double tp=0,datetime ex=0)
{
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
double op=NormalizeDouble(OrderOpenPrice() , dg);
double os=NormalizeDouble(OrderStopLoss() , dg);
double ot=NormalizeDouble(OrderTakeProfit(), dg);
color cl;
if(pp<=0) pp=OrderOpenPrice();
if(sl<0 ) sl=OrderStopLoss();
if(tp<0 ) tp=OrderTakeProfit();
pp=NormalizeDouble(pp, dg);
sl=NormalizeDouble(sl, dg);
tp=NormalizeDouble(tp, dg);
if(pp!=op || sl!=os || tp!=ot)
{
if(MathMod(OrderType(),2)==0) cl=clModifyBuy; else cl=clModifySell;
if(!OrderModify(OrderTicket(),pp,sl,tp,ex,cl))
{
er=GetLastError();
Print("Error(",er,") modifying order: ",ErrorDescription(er));
Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
" op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
}
}
}
//+----------------------------------------------------------------------------+
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
---