Orders Execution
0
Views
0
Downloads
0
Favorites
e-MoveSLTPbyMouse
//+----------------------------------------------------------------------------+
//| e-MoveSLTPbyMouse.mq4 |
//| |
//| Êèì Èãîðü Â. aka KimIV |
//| http://www.kimiv.ru |
//| |
//| 31.03.2008 Ñîâåòíèê äëÿ ïåðåìåùåíèÿ óðîâíåé SL è TP ñ ïîìîùüþ ìûøè. |
//| 08.04.2008 Íîðìèðîâàíèå óðîâíåé SL è TP ïîä ðàçìåð òèêà. |
//+----------------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link "http://www.kimiv.ru"
//------- Âíåøíèå ïàðàìåòðû ñîâåòíèêà -----------------------------------------+
extern string _P_Expert = "---------- Parameters of e-MoveSL&TPbyMouse";
extern int Language = 0; // ßçûê: 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 = Red; // Öâåò ëèíèè óðîâíÿ TakeProfit
extern int TakeStyle = 3; // Ñòèëü ëèíèè óðîâíÿ TakeProfit
extern int TakeWidth = 0; // Òîëùèíà ëèíèè óðîâíÿ TakeProfit
//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà -------------------------------------+
color clModifyBuy = Aqua; // Öâåò çíà÷êà ìîäèôèêàöèè ïîêóïêè
color clModifySell = Tomato; // Öâåò çíà÷êà ìîäèôèêàöèè ïðîäàæè
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]);
Print("init");
}
//+----------------------------------------------------------------------------+
//| 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 |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 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);
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;
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);
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;
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
---