Overdraft Profit System
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «!overdraft_profit_system2_v0.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Overdraft Profit System — советник для MetaTrader 4, автоматизирующий торговлю на основе сигналов пользовательского индикатора fractals. Советник поддерживает два режима работы: виртуальный (отслеживание условных позиций) и реальный (открытие настоящих сделок через торговый API платформы).
В основе логики — анализ фрактальных паттернов на указанном таймфрейме с фильтрацией по текущему спреду. Имеется несколько режимов открытия позиций: прямое следование сигналам и реверсивная торговля. Для управления рисками предусмотрены стоп-лосс, тейк-профит, трейлинг по прибыли и параметры money management.
Советник отображает на графике панели с информацией о виртуальных и реальных позициях, а также данные по спреду. Настройки включают параметры лота, фильтрации спреда, режимов закрытия и отображения информации.
Настройки программы
| Настройка | Описание |
|---|---|
| ? ??????? ?? ??????? ??????-?????????? (bMarketExec) | Рыночное исполнение — Переключатель рыночного исполнения: если true, стоп-лосс и тейк-профит устанавливаются отдельным запросом после открытия. |
| ??????????????? ??? ???????? ?????????? (Slip) | Проскальзывание — Допустимое проскальзывание для торговых операций. |
| ????????? ???????? ?????? true/false (bTrade) | Разрешение реальной торговли — Разрешение открытия реальных торговых позиций. Если false, торговля не выполняется. |
| true -????????? ???????? ?????? ?????????????? ???????? / false-? ??? ?? ??????????? (bRevers) | Реверсивная торговля — Переключатель реверсивной торговли: true — разворот позиции, false — продолжение направления. |
| ????? ????? ? ?????. ???? =0 ?? ?? ?????????, ???? =1, ?? ?????????????? ?????? ??????????? ??????. (OpenMode) | Режим открытия позиций — Режим открытия: 0 — только по сигналам индикатора, 1 — реверсивное открытие на основе последней виртуальной позиции. |
| ??? ??????. ???? =0, ?? ?????????? ?? (Lot) | Размер лота — Размер лота для открытия позиции. Если 0, лот рассчитывается автоматически. |
| ??????? ?? ??????? ??? ????. (MM) | Мультипликатор от баланса — Мультипликатор для расчёта лота от баланса счёта. |
| ????????? ??? ?????????? ???? ????? ??????, ???? =0, ?? ???????? (LotKoef) | Множитель увеличения лота — Множитель увеличения лота при убыточных виртуальных позициях. Если 0 — без увеличения. |
| ????? ????????? ???????, ????? ???????? ???????? ??????? ??? ?? LotKoef (LotKoefStart) | Начало применения множителя лота — Номер виртуальной позиции, начиная с которого применяется LotKoef. |
| ????? ????????? ???? ??? ??????? ???????? ???? ?????????. (nDay) | Период расчёта среднего стопа — Количество дней, за которые рассчитывается средний размер стопа. |
| ????? ??????????? ?????? 0/1/2/3 (SpreadMode) | Режим фильтрации спреда — Режим учёта спреда при открытии: 0 — без фильтрации, 1–3 — различные варианты фильтрации. |
| ?????? ????????????? ??????????? ?????? ??? SpreadMode=3 (FixSpread) | Фиксированный спред — Фиксированное значение спреда для компенсации при SpreadMode = 3. |
| ?????????? ????????? ???????? ?????? ??? ?????????? ???????? ?????? (AvgSpreadCount) | Кол-во значений спреда для усреднения — Количество последних значений спреда для усреднения. |
| ????????? ??? ?????? ??????????? (AvgSpreadKoef) | Множитель компенсации по среднему спреду — Множитель для расчёта компенсации на основе среднего спреда. |
| ????? ???????? 0-???????? ?? ???????????? ??/??, (CloseMode) | Режим закрытия позиций — Режим закрытия реальных позиций: 0 — по сигналу индикатора, 1 — по изменению направления, 2 — по SL/TP, 3 — по SL/TP или сигналу, 4 — по SL/TP или сигналу с доп. условием. |
| ???? =1 - ? ??????? ??????????? ???????????? ???????????? ?????? ??????????? (SpreadModeClose) | Компенсация спреда при закрытии — Флаг применения компенсации спреда при закрытии реальных позиций. Если 1 — компенсация добавляется к тейк-профиту. |
| ?????? ??????????? ??? CloseMode=2. ???? =0, ?? ?? ?????? (TP) | Тейк-профит в пунктах — Значение тейк-профита в пунктах при CloseMode = 2 или 3. Если 0 — без тейк-профита. |
| ?????? ???????? ??? CloseMode=2. ???? =0, ?? ?? ?????? (SL) | Стоп-лосс в пунктах — Значение стоп-лосса в пунктах при CloseMode = 2 или 3. Если 0 — без стоп-лосса. |
| ??????? ??????? ??????????? ??? ????? ???????? ? ???????, ???? =0, ?? ???? ????????. (ProcentProfit) | Процент прибыли для трейлинга — Процент прибыли виртуальной позиции, при достижении которого запускается трейлинг реальной позиции. |
| ??????? ??? ??????? ???????? ??? ?????, ???? =0, ?? ???? ????????. (CloseProcentProfit) | Процент трейлинга стоп-лосса — Процент от прибыли позиции, на который сдвигается стоп-лосс при трейлинге. |
| IndName | Имя индикатора сигналов — Имя пользовательского индикатора, используемого для генерации торговых сигналов. |
| ???????????? ????? ?????? ?????? ????? ? ?????? ??? ???????????? ???????? (Equals) | Параметр фрактального индикатора — Параметр передаётся в пользовательский индикатор для определения фрактальных уровней. |
| ??????????? ????? ????? ????? ??? ???????? ????? (nLeftUp) | Бары слева для верхнего фрактала — Количество баров слева для определения верхнего фрактала. |
| ??????????? ????? ????? ?????? ??? ???????? ????? (nRightUp) | Бары справа для верхнего фрактала — Количество баров справа для определения верхнего фрактала. |
| ??????????? ????? ????? ????? ??? ???????? ???? (nLeftDown) | Бары слева для нижнего фрактала — Количество баров слева для определения нижнего фрактала. |
| // ??????????? ????? ????? ?????? ??? ???????? ???? (nRightDown) | Бары справа для нижнего фрактала — Количество баров справа для определения нижнего фрактала. |
| ?????????? ?? ????? ???? ?????? ????.???????. (bVirtInfo) | Отображение панели виртуальных позиций — Отображение на графике панели с информацией о виртуальных позициях. |
| ?????????? ?? ????? ???? ?????? ????.???????. (bRealInfo) | Отображение панели реальных позиций — Отображение на графике панели с информацией о реальных позициях. |
| ?????????? ?? ????? ???? ?????? ??? ????? (bSpreadInfo) | Отображение панели спреда — Отображение на графике панели со сведениями о спреде. |
| ?????????? ???? ? ??????? ?? ????? (bShowComment) | Отображение комментариев — Отображение текстовых комментариев на графике. |
| ?????????? ??????????? ?????? ?? ????? (bShowVOrder) | Отображение виртуальных ордеров — Отображение на графике графических объектов для виртуальных ордеров. |
Поиск по коду файла
#property strict
#include <stdlib.mqh>
#define OP_MARKET 8
#define OP_ALL -1
int Magic=1234;/*Magic*/ // ????? ??????? ??????? ??
extern bool bMarketExec=true;/*bMarketExec*/ // ? ??????? ?? ??????? ??????-??????????
extern int Slip=0;/*Slip*/ // ??????????????? ??? ???????? ??????????
extern string inf1="// ??????";
extern bool bTrade=true;/*bTrade*/ // ????????? ???????? ?????? true/false
extern bool bRevers=true;/*bRevers*/ // true -????????? ???????? ?????? ?????????????? ???????? / false-? ??? ?? ???????????
extern int OpenMode=0;/*OpenMode*/ // ????? ????? ? ?????. ???? =0 ?? ?? ?????????, ???? =1, ?? ?????????????? ?????? ??????????? ??????.
extern double Lot=0;/*Lot*/ // ??? ??????. ???? =0, ?? ?????????? ??
extern double MM=2;/*MM*/ //??????? ?? ??????? ??? ????.
extern double LotKoef=2;/*LotKoef*/ // ????????? ??? ?????????? ???? ????? ??????, ???? =0, ?? ????????
extern int LotKoefStart=0;/*LotKoefStart*/ // ????? ????????? ???????, ????? ???????? ???????? ??????? ??? ?? LotKoef
extern int nDay=14;/*nDay*/ // ????? ????????? ???? ??? ??????? ???????? ???? ?????????.
extern int SpreadMode=3;/*SpreadMode*/ // ????? ??????????? ?????? 0/1/2/3
extern int FixSpread=5;/*FixSpread*/ // ?????? ????????????? ??????????? ?????? ??? SpreadMode=3
extern int AvgSpreadCount=20;/*AvgSpreadCount*/ // ?????????? ????????? ???????? ?????? ??? ?????????? ???????? ??????
extern double AvgSpreadKoef=2;/*AvgSpreadKoef*/ // ????????? ??? ?????? ???????????
extern int CloseMode=2;/*CloseMode*/ // ????? ???????? 0-???????? ?? ???????????? ??/??,
extern int SpreadModeClose=1;/*SpreadModeClose*/ // ???? =1 - ? ??????? ??????????? ???????????? ???????????? ?????? ???????????
extern int TP=30;/*TP*/ // ?????? ??????????? ??? CloseMode=2. ???? =0, ?? ?? ??????
extern int SL=30;/*SL*/ // ?????? ???????? ??? CloseMode=2. ???? =0, ?? ?? ??????
extern double ProcentProfit=80;/*ProcentProfit*/ // ??????? ??????? ??????????? ??? ????? ???????? ? ???????, ???? =0, ?? ???? ????????.
extern double CloseProcentProfit=30;/*CloseProcentProfit*/ // ??????? ??? ??????? ???????? ??? ?????, ???? =0, ?? ???? ????????.
extern string inf2="// ?????????";
extern string IndName="wlxFractals";
extern int Equals = 20;/*Equals*/ // ???????????? ????? ?????? ?????? ????? ? ?????? ??? ???????????? ????????
extern int nLeftUp = 20;/*nLeftUp*/ // ??????????? ????? ????? ????? ??? ???????? ?????
extern int nRightUp = 20;/*nRightUp*/ // ??????????? ????? ????? ?????? ??? ???????? ?????
extern int nLeftDown = 20;/*nLeftDown*/ // ??????????? ????? ????? ????? ??? ???????? ????
extern int nRightDown = 20;/*nRightDown*/ // // ??????????? ????? ????? ?????? ??? ???????? ????
extern string inf3="// ????";
extern bool bVirtInfo=true;/*bVirtInfo*/ // ?????????? ?? ????? ???? ?????? ????.???????.
extern bool bRealInfo=true;/*bRealInfo*/ // ?????????? ?? ????? ???? ?????? ????.???????.
extern bool bSpreadInfo=true;/*bSpreadInfo*/ // ?????????? ?? ????? ???? ?????? ??? ?????
extern bool bShowComment=true;/*bShowComment*/ // ?????????? ???? ? ??????? ?? ?????
extern bool bShowVOrder=true;/*bShowVOrder*/ // ?????????? ??????????? ?????? ?? ?????
string sID; // ID EA ??? ?????????? ??????????
bool bTesting; // ???? ??? ??????? ??????
double FreezLvl, StopLvl, Spread, Pnt, _Pnt, _Bid, _Ask, LotStep, LotSize, MaxLot, MinLot, TickSize, TickVal, ProfitCalcMode; int _Digit;
string g_inf;
double spread[]; int is=0;
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
if (IsTesting() || IsOptimization()) GlobalVariablesDeleteAll(sID);
ObjectsDeleteAll2(0, -1, sID); // ??????? ???????
}
void OnTick()
{
// код доступен только после оплаты
}
void main(int SysID, string smb, int tf)
{
RefreshParam(smb);
OpenVPos(SysID, smb, tf); // ?. ???????? ???????????? ??????
CloseVPos(SysID, smb, tf); // ?. ???????? ???????????? ??????
OpenRPos(SysID, smb, tf); // ?. ???????? ????????? ??????
CloseRPos(SysID, smb, tf); // ?. ???????? ????????? ??????
TralRPos(SysID, smb); // ?. ??????????? ???????? ????????? ??????
int y=20;
VirtInfo(SysID, smb, y);
RealInfo(SysID, smb, y);
SpreadInfo(SysID, smb, y);
}
int CheckOpenSignal(string smb, int tf, int &i)
{
INF("+????????? ?????? ???????? ???????????? ??????", true);
int n=iBars(smb, tf);
for (i=0; i<n; i++)
{
double f=iCustom(smb, tf, IndName, Equals, nLeftUp, nRightUp, nLeftDown, nRightDown, 0, i); if (f>0 && f!=EMPTY_VALUE) return(OP_BUY); // Buy: ???? ????????? ??????? wlxFractals ?????
f=iCustom(smb, tf, IndName, Equals, nLeftUp, nRightUp, nLeftDown, nRightDown, 1, i); if (f>0 && f!=EMPTY_VALUE) return(OP_SELL); // Sell: ???? ????????? ??????? wlxFractals ???????
}
return(-1);
}
double CountStopSize(int dir, string smb, int tf)
{
datetime dt=iTime(smb, PERIOD_H1, nDay*24-1); // ????? ????????? ??????
INF("+?????? ???????? ???? ???? ?? "+ITS(nDay)+" ???? (?? "+TTS(dt)+")", true);
int i=0;
double avg=0; int n=0;
while (iTime(smb, tf, i)>dt) // ???? ? ????????? nDay
{
double f1=GetNextFrac(ADIR(dir), smb, tf, i); if (f1<=0) break; i++;
double f2=GetNextFrac(dir, smb, tf, i); if (f2<=0) break; i++;
if (iTime(smb, tf, i)<dt) break;
avg+=fabs(f1-f2); n++;
}
INF("????? ??????????="+ITS(n)+" avg="+DTS(avg));
if (n<=0) return(0); // ???? ?? ????? ?? ?????? ??????????, ?? ??????
return(avg/n); // ????? ??????? ???????
}
double GetNextFrac(int dir, string smb, int tf, int &b)
{
int n=iBars(smb, tf);
for (int i=b; i<n; i++) { double f=iCustom(smb, tf, IndName, Equals, nLeftUp, nRightUp, nLeftDown, nRightDown, dir, i); if (f>0 && f!=EMPTY_VALUE) { b=i; return(f); } }
return(-1);
}
void OpenVPos(int SysID, string smb, int tf)
{
INF("");
INF("+?. ???????? ???????????? ??????", true);
if (OpenMode!=0 && OpenMode!=1) { INF("OpenMode ?? 0 ? ?? 1. ???????? ?? ?????????"); return; }
if (SpreadMode==2 && is<AvgSpreadCount-1) { INF("???? ?????????? "+ITS(AvgSpreadCount)+" ????? ??? ??????"); return; }
if (CountOrders(-1, SysID, smb)!=0) { INF("???????? ?????? ??? ???????. ???? ????????"); return; }
double lprof=0, llot=0; int ldir=-1, last=LastOrder(ldir, lprof, llot);
int ib=-1, dir=-1;
if (OpenMode==0 || last<=0 || ldir<0)
{
dir=CheckOpenSignal(smb, tf, ib); if (dir<0) { INF("-???? ??????? ????????..."); return; }
INF("??????? ?????? "+OTS(dir));
if (CheckGV(sID+"Time")) if (GetGV(sID+"Time")>=iTime(smb, tf, ib)) { INF("?? ???? ??????? ??? ????????? ?????"); return; }
}
if (OpenMode==1 && last>0)
{
dir=bRevers?ldir:ADIR(ldir);
INF("?????????? R ????? "+OTS(ldir)+" #"+ITS(last)+" ????????? ???? ? "+OTS(dir));
}
if (dir<0) { INF("??????????? ???????? ????.?????? ?? ??????????"); return; }
string name[]; int n=SelectGV(sID+"VOrder.", name);
bool b=false; string sid=""; int id=0;
for (int i=0; i<n; i++)
{
sid=StringSubstr(name[i], StringLen(sID+"VOrder."));
id=STI(sid); sid=sID+"VO."+sid;
if (CheckGV(sid+".cl")) continue;
if (bShowVOrder) { DrawOrder(sid, id, (int)GetGV(name[i]), GetGV(sid+".op"), 0, 0); DrawDeal(sid, id, (int)GetGV(name[i]), Lot, GetGV(sid+".op"), (datetime)GetGV(sid+".dop"), 0, 0, 0, 0); }
b=true; break;
} //
if (b) { INF("???? ???????? V ?????? #"+ITS(id)); return; }
Print("??????? "+ITS(n)+" ????.??????? ? ???????. ???????? ???.");
Print("?? ???? "+TTS(iTime(smb, tf, ib))+" ??? ?? ?????????.");
double op=NPR(dir);
id=int(GetTickCount()+MathRand()); // "?????" ???????????? ??????
sid=sID+"VO."+ITS(id);
SetGV(sID+"VOrder."+ITS(id), dir); // ???
MqlDateTime md; datetime dop=TimeCurrent(md); // ??????? ?????
double lot=Lot; if (Lot<=0) lot=(AccountBalance()/1000.0)*MM/100.0; lot=NL(lot); // ??????????? ???
if (LotKoef!=0) // ??????????? ?????????? ??????
{
double l=GetGV(sID+"Lot"); int No=(int)GetGV(sID+"N");
Print("?????????? ?????? ????.??????="+DTS(lprof,2)+" ????????? ???="+DTS(l,2)+" ????? ???????="+ITS(No));
if (lprof>=0) { SetGV(sID+"Lot", lot); SetGV(sID+"N", 0); }
else { if (l>0) lot=NL(l*MathPow(LotKoef, fmax(No+1-LotKoefStart,0))); SetGV(sID+"N", No+1); }
}
SetGV(sid+".op", op); SetGV(sid+".dop", dop); SetGV(sid+".lot", lot); DelGV(sid+".cl"); // ????????? ????????? ??????
string txt="Open V "+smb+" "+OTS(dir)+"#"+ITS(id)+" | op="+DTS(op);
INF(txt); Print("+"+txt);
SetGV(sID+"Time", iTime(smb, tf, ib)); Print("????????? ????? ???????? ??????? "+TTS(iTime(smb, tf, ib)));
if (bShowVOrder) { DrawOrder(sid, id, dir, op, 0, 0); DrawDeal(sid, id, dir, Lot, op, dop, 0, 0, 0, 0); }
}
int LastOrder(int &dir, double &prof, double &lot)
{
if (!CheckGV(sID+"Last")) return(-1);
int ticket=(int)GetGV(sID+"Last");
if (!OrderSelect(ticket, SELECT_BY_TICKET)) return(0);
dir=OrderType(); prof=OrderProfit(); lot=OrderLots();
return(ticket);
}
void CloseVPos(int SysID, string smb, int tf)
{
INF("");
INF("+?. ???????? ???????????? ??????", true);
string name[]; int n=SelectGV(sID+"VOrder.", name);
MqlDateTime md; datetime dcl=TimeCurrent(md); // ??????? ?????
int ticketO[]; int no=GetTickets(-1, SysID, smb, ticketO);
int ticketH[]; int nh=GetTicketsH(-1, SysID, smb, ticketH);
for (int i=0; i<n; i++)
{
string sid=StringSubstr(name[i], StringLen(sID+"VOrder."));
int id=STI(sid); sid=sID+"VO."+sid;
if (CheckGV(sid+".cl")) continue; // ??? ??????
int dir=(int)GetGV(name[i]);
double apr=APR(dir);
double op=GetGV(sid+".op"); datetime dop=(datetime)GetGV(sid+".dop");
if (bShowVOrder) { DrawOrder(sid, id, dir, op, 0, 0); DrawDeal(sid, id, dir, Lot, op, dop, 0, 0, 0, 0); }
if (FindComment(ticketO, no, ITS(id)+"|")>0) { INF("????? ??? #"+ITS(id)+" ??? ??????"); continue; }
if (FindComment(ticketH, nh, ITS(id)+"|")<=0) { INF("????? ??? #"+ITS(id)+" ??? ?? ??????/?? ??????"); continue; }
SetGV(sid+".cl", apr); SetGV(sid+".dcl", dcl); // ??????? ?????
string txt="Close V "+smb+" "+OTS(dir)+"#"+ITS(id)+" | cl="+DTS(apr);
INF(txt); Print("+"+txt);
if (bShowVOrder) { DrawDeal(sid, id, dir, Lot, op, dop, apr, dcl, 0, 0); ObjectsDeleteAll2(0, OBJ_HLINE, sid); }
}
}
void OpenRPos(int SysID, string smb, int tf)
{
INF("");
INF("+?. ???????? ????????? ??????", true);
if (!bTrade) { INF("?? ?????????"); return; }
string name[]; int n=SelectGV(sID+"VOrder.", name); if (n<=0) { INF("???? V ??????"); return; }
int ticketO[]; int no=GetTickets(-1, SysID, smb, ticketO);
int ticketH[]; int nh=GetTicketsH(-1, SysID, smb, ticketH);
for (int i=0; i<n; i++)
{
string sid=StringSubstr(name[i], StringLen(sID+"VOrder."));
int id=STI(sid);
int dir=(int)GetGV(name[i]); // ??? ????????????
double vop=GetGV(sID+"VO."+sid+".op"); // ???? ???????? ????????????
if (CheckGV(sID+"VO."+sid+".cl")) continue; // ??????????? ????? ??? ??????
if (!CheckGV(sID+"VO."+sid+".lot")) { double lot=Lot; if (Lot<=0) lot=AccountBalance()*MM/100.0; lot=NL(lot); SetGV(sID+"VO."+sid+".lot", lot); }
double lot=GetGV(sID+"VO."+sid+".lot"); lot=NL(lot);
if (bRevers) dir=ADIR(dir); // ??????????? ?????
if (FindComment(ticketO, no, sid+"|")>0) { INF("????? ??? #"+sid+" ??? ??????"); continue; }
if (FindComment(ticketH, nh, sid+"|")>0) { INF("????? ??? #"+sid+" ??? ??????"); continue; }
double op=NPR(dir), apr=APR(dir);
int comp=0;
if (bRevers)
{
comp=GetComp();
if (comp>0 && (vop-op)*SD(dir)<comp*Pnt*_Pnt) { INF("???????? ????? "+DTS((comp-(vop-op)*SD(dir)/(Pnt*_Pnt)),0)+" ?."); continue; }
}
lot=NL(lot); // ??????????? ???
comp=int(fabs(vop-op)/(Pnt*_Pnt));
double d=CountStopSize(dir, smb, tf); string txt=("??????????? ?????? ??/??="+DTS(d/(Pnt*_Pnt),0)+" ?.");
INF(txt); if (d<=0) { INF("-???????? ?????? ??/??"); continue; }
Print(txt); // ??? ?????? ?????
double tp=0, sl=0;
double dtp=0, dsl=0;
if (CloseMode==0) { dtp=d; dsl=d; }
if (CloseMode==2 || CloseMode==4) { dtp=TP*Pnt*_Pnt; dsl=SL*Pnt*_Pnt; }
if (CloseMode==3) { dtp=(TP<=0 || d<TP*Pnt*_Pnt)?d:TP*Pnt*_Pnt; dsl=(SL<=0 || d<SL*Pnt*_Pnt)?d:SL*Pnt*_Pnt; }
tp=dtp<=0?0:op+dtp*SD(dir); tp=NTP(dir, op, apr, tp, StopLvl, false);
sl=dsl<=0?0:op-dsl*SD(dir); sl=NSL(dir, op, apr, sl, StopLvl, false);
if (SpreadModeClose==1 && tp>0 && comp>0) { tp+=comp*SD(dir)*Pnt*_Pnt; Print("? ?? ?????????? ???????????="+ITS(comp)+" ?."); }
int ticket=-1;
if (bMarketExec) ticket=OrderSend(smb, dir, lot, op, Slip, 0, 0, sid+"|"+ITS(comp), SysID, 0, OTC(dir));
else ticket=OrderSend(smb, dir, lot, op, Slip, sl, tp, sid+"|"+ITS(comp), SysID, 0, OTC(dir));
txt="Open R "+smb+" "+OTS(dir)+"#"+ITS(ticket)+" op="+DTS(op)+" lot="+DTS(lot, 2)+" ? ????. id="+sid+" ?????????.="+ITS(comp)+" | magic="+ITS(SysID);
INF(txt);
if (ticket<=0) ErrorHandle(GetLastError(), -1, SysID, txt);
else
{
Print("+"+txt); SetGV(sID+"Last", ticket);
if (bMarketExec) PlaceStop(ticket, dir, SysID, smb, op, sl, tp);
}
}
}
void CloseRPos(int SysID, string smb, int tf)
{
INF("");
INF("+?. ???????? ????????? ??????", true);
if (CloseMode!=1 && CloseMode!=4) { INF("-?? ??????????. CloseMode ?? 1 ? ?? 4"); return; }
int ticket[], n=GetTickets(-1, SysID, smb, ticket); if (n<=0) { INF("wait orders"); return; }
int ib=0;
int sd=CheckOpenSignal(smb, tf, ib);
for (int i=0; i<n; i++)
{
if (!OrderSelect(ticket[i], SELECT_BY_TICKET)) { INF("?????? ????????? ?????? "+ITS(ticket[i])); continue; }
int dir=OrderType();
if ((!bRevers && dir==sd) || (bRevers && ADIR(dir)==sd)) { INF("???? ??????????????? ?????? ??? "+OTS(dir)+"#"+ITS(ticket[i])); continue; }
string txt="Close R "+smb+" "+OTS(dir)+" #"+ITS(ticket[i])+" prof="+DTS(OrderProfit(),2)+" pip="+DTS((OrderClosePrice()-OrderOpenPrice())/(Pnt*_Pnt),0)+" ?? ??????? "+OTS(sd);
INF(txt);
if (!OrderClose(ticket[i], OrderLots(), APR(dir), Slip, OTC(dir))) ErrorHandle(GetLastError(), ticket[i], SysID, txt); else Print(txt);
}
}
void TralRPos(int SysID, string smb)
{
INF("");
INF("+?. ??????????? ???????? ????????? ??????", true);
if (ProcentProfit<=0 || CloseProcentProfit<=0) { INF("-?? ??????????. ProcentProfit ??? CloseProcentProfit ==0"); return; }
int ticket[], n=GetTickets(-1, SysID, smb, ticket); if (n<=0) { INF("wait orders"); return; }
for (int i=0; i<n; i++)
{
if (!OrderSelect(ticket[i], SELECT_BY_TICKET)) { INF("?????? ????????? ?????? "+ITS(ticket[i])); continue; }
int dir=OrderType(); RefreshParam(smb); double apr=APR(dir); // ???????? ?????????
double csl=ND(OrderStopLoss()); double cop=ND(OrderOpenPrice()); double ctp=ND(OrderTakeProfit());
if (MathAbs(ctp-apr)<=FreezLvl || MathAbs(csl-apr)<=FreezLvl) { INF(OTS(dir)+"#"+ITS(ticket[i])+" freezed"); continue; }
double wtp=(ctp-cop)*SD(dir)*ProcentProfit/100; if (wtp<=0) { INF("? ?????? #"+ITS(ticket[i])+" ?? ?????????? ??????????"); continue; }
if ((apr-cop)*SD(dir)<wtp) { INF("???? ?????????? "+DTS(wtp/(Pnt*_Pnt),0)+" ?. ???????. ???????? "+DTS((wtp-(apr-cop)*SD(dir))/(Pnt*_Pnt),0)); continue; }
double sl=NSL(dir, apr, apr, cop+wtp*(1-CloseProcentProfit/100)*SD(dir), StopLvl, false);
if ((sl-cop)*SD(dir)>0 && ((sl-csl)*SD(dir)>0 || csl==NP(0)))
{
string txt="Tral R "+smb+" "+OTS(dir)+" #"+ITS(ticket[i])+" csl="+DTS(csl)+"->"+DTS(sl)+" id="+ITS(SysID);
INF(txt);
if (!OrderModify(ticket[i], cop, sl, ctp, 0, OTC(dir))) ErrorHandle(GetLastError(), ticket[i], SysID, txt); else Print("+"+txt);
}
}
}
void PlaceStop(int ticket, int dir, int SysID, string smb, double op, double nsl, double ntp)
{
RefreshParam(smb); double apr=APR(dir);
double sl=NSL(dir, op, apr, nsl, StopLvl, false);
double tp=NTP(dir, op, apr, ntp, StopLvl, false);
string txt="Place stops to "+OTS(dir)+"#"+ITS(ticket)+" op="+DTS(op)+" apr="+DTS(apr)+"| sl="+DTS(sl)+" tp="+DTS(tp)+" id="+ITS(SysID);
Print(txt); INF(txt);
int i=0;
while (i<5 && (tp>0 || sl>0))
{
RefreshParam(smb); apr=APR(dir);
sl=NSL(dir, op, apr, nsl, StopLvl, false);
tp=NTP(dir, op, apr, ntp, StopLvl, false);
txt="Place stops to "+OTS(dir)+"#"+ITS(ticket)+" op="+DTS(op)+" apr="+DTS(apr)+"| sl="+DTS(sl)+" tp="+DTS(tp)+" id="+ITS(SysID);
if (OrderModify(ticket, op, sl, tp, 0, OTC(dir))) break;
INF(txt); ErrorHandle(GetLastError(), -1, SysID, txt); Sleep(100); i++;
}
}
void VirtInfo(int SysID, string smb, int &y)
{
if (!bVirtInfo) return;
string txt[100]; int t=-1; color clr[100]; ArrayInitialize(clr, clrLightGray);
string name[]; int n=SelectGV(sID+"VOrder.", name);
int cdir=-1, cticket=0; double cop=0, cprof=0, cpprof=0, apr=0;
double prof=0, loss=0, pprof=0, ploss=0; int nb=0, ns=0;
t++; txt[t]="======== VIRTUAL ======="; clr[t]=clrGray;
for (int i=0; i<n; i++)
{
string sid=StringSubstr(name[i], StringLen(sID+"VOrder."));
int id=STI(sid);
int dir=(int)GetGV(name[i]); // ??? ????????????
double op=GetGV(sID+"VO."+sid+".op"); // ???? ???????? ????????????
double lot=GetGV(sID+"VO."+sid+".lot");
if (!CheckGV(sID+"VO."+sid+".cl"))
{
cdir=dir; cticket=id; cop=op; apr=APR(dir);
cpprof=(apr-cop)*SD(cdir); cprof=CalcProf(cdir, op, apr, lot);
t++; txt[t]=OTS(cdir)+"#"+ITS(cticket)+" | "+DTS(cop)+" | "+DTS(apr)+" | "+DTS(cpprof/(Pnt*_Pnt),0)+"?. | "+DTS(cprof,2)+"$"; clr[t]=OTC(cdir);
}
else
{
double cl=GetGV(sID+"VO."+sid+".cl");
double pip=(cl-op)*SD(dir);
if (pip>=0) { prof+=CalcProf(dir, op, cl, lot); pprof+=pip; } else { loss+=CalcProf(dir, op, cl, lot); ploss+=pip; }
if (dir==OP_BUY) nb++; else ns++;
}
}
if (cdir<0) { t++; txt[t]="???????? ???????: ???"; }
t++; txt[t]="?????????";
t++; txt[t]="???????? ???????: Sell "+ITS(ns)+" | Buy "+ITS(nb);
t++; txt[t]="???????: "+DTS(pprof/(Pnt*_Pnt),0)+" ?./"+DTS(prof,2);
t++; txt[t]="??????: "+DTS(ploss/(Pnt*_Pnt),0)+" ?./"+DTS(loss,2);
t++; txt[t]="?????: "+DTS((pprof+ploss)/(Pnt*_Pnt),0)+" ?./"+DTS(prof+loss,2);
Comment2(sID+"vi.", t+1, txt, clr, 1, 10, y);
y+=20;
}
void RealInfo(int SysID, string smb, int &y)
{
if (!bRealInfo) return;
string txt[100]; int t=-1; color clr[100]; ArrayInitialize(clr, clrLightGray);
t++; txt[t]="========== REAL ========="; clr[t]=clrGray;
int ticketO[]; int no=GetTickets(-1, SysID, smb, ticketO);
int ticketH[]; int nh=GetTicketsH(-1, SysID, smb, ticketH);
int cdir=-1, cticket=0; double cop=0, cprof=0, cpprof=0, apr=0;
int comp=0; double pcomp=0;
for (int i=0; i<no; i++)
{
if (!OrderSelect(ticketO[i], SELECT_BY_TICKET)) continue;
cticket=OrderTicket(); cdir=OrderType();
cop=OrderOpenPrice(); cprof=OrderProfit(); cpprof=(OrderClosePrice()-OrderOpenPrice())*SD(cdir);
apr=APR(cdir);
int c=StringFind(OrderComment(), "|"); if (c>0) { int p=STI(StringSubstr(OrderComment(), c+1)); comp+=p; pcomp+=CalcProf(0, 0, p*Pnt*_Pnt, OrderLots()); }
t++; txt[t]=OTS(cdir)+"#"+ITS(cticket)+" | "+DTS(cop)+" | "+DTS(apr)+" | "+DTS(cpprof/(Pnt*_Pnt),0)+"?. | "+DTS(cprof,2)+"$"; clr[t]=OTC(cdir);
}
double prof=0, loss=0, pprof=0, ploss=0; int nb=0, ns=0;
for (int i=0; i<nh; i++)
{
if (!OrderSelect(ticketH[i], SELECT_BY_TICKET)) continue;
int c=StringFind(OrderComment(), "|"); if (c<0) continue;
int p=STI(StringSubstr(OrderComment(), c+1)); comp+=p; pcomp+=CalcProf(0, 0, p*Pnt*_Pnt, OrderLots());
if (OrderProfit()>=0) { prof+=OrderProfit(); pprof+=(OrderClosePrice()-OrderOpenPrice())*SD(OrderType()); }
else { loss+=OrderProfit(); ploss+=(OrderClosePrice()-OrderOpenPrice())*SD(OrderType()); }
if (OrderType()==OP_BUY) nb++; else ns++;
}
if (cdir<0) { t++; txt[t]="???????? ???????: ???"; }
t++; txt[t]="?????????";
t++; txt[t]="???????? ???????: Sell "+ITS(ns)+" | Buy "+ITS(nb);
t++; txt[t]="???????: "+DTS(pprof/(Pnt*_Pnt),0)+" ?./"+DTS(prof,2);
t++; txt[t]="??????: "+DTS(ploss/(Pnt*_Pnt),0)+" ?./"+DTS(loss,2);
t++; txt[t]="?????: "+DTS((pprof+ploss)/(Pnt*_Pnt),0)+" ?./"+DTS(prof+loss,2);
t++; txt[t]="?????????";
t++; txt[t]="????? ???????????: "+ITS(comp)+" ?./"+DTS(pcomp,2);
Comment2(sID+"ri.", t+1, txt, clr, 1, 10, y);
y+=20;
}
void SpreadInfo(int SysID, string smb, int &y)
{
if (!bSpreadInfo) return;
string txt[100]; int t=-1; color clr[100]; ArrayInitialize(clr, clrLightGray);
t++; txt[t]="========= SPREAD ========"; clr[t]=clrGray;
t++; txt[t]="????? ???????????: "+ITS(SpreadMode);
t++; txt[t]="??????? ?????: "+DTS(Spread/(Pnt*_Pnt),0)+" ?.";
t++; txt[t]="??????? ?????("+ITS(is)+"): "+DTS(AvgSpread()/(Pnt*_Pnt),0)+" ?.";
t++; txt[t]="???????????: "+ITS(GetComp())+" ?.";
Comment2(sID+"si.", t+1, txt, clr, 1, 10, y);
y+=20;
}
double CalcProf(int dir, double op, double cl, double lot)
{
if (ProfitCalcMode==0) return((cl-op)*SD(dir)*lot*TickVal/TickSize); // forex
if (ProfitCalcMode==1) return((cl-op)*SD(dir)*lot*LotSize); // cfd
if (ProfitCalcMode==2) return((cl-op)*SD(dir)*lot*TickVal/TickSize); // futures
return(0);
}
int FindComment(int &ticket[], int n, string pref)
{
for (int i=0; i<n; i++)
{
if (!OrderSelect(ticket[i], SELECT_BY_TICKET)) continue;
if (StringFind(OrderComment(), pref, 0)==0) return(ticket[i]);
}
return(0);
}
int GetComp()
{
int comp=0;
if (SpreadMode==1) comp=int((2*Spread)/(Pnt*_Pnt));
if (SpreПоказано первые 50% кода (символов: 37337)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.