← К каталогу
Исходный код · ID 2954

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 и перейдите к оплате.

Стоимость полного кода
3 733,70₽ ≈ $45.63