891 lines
105 KiB
MQL5
891 lines
105 KiB
MQL5
//============================================================================================= MQL5 ===
|
|
// LibreInfoPDO Main_5 v1.006 MQL5
|
|
// Модуль обработки событий
|
|
// LibreCoin (c)2014-2018
|
|
//======================================================================================================
|
|
#property strict
|
|
//============================================================================================= MQL5 ===
|
|
// INCLUDE - подключаемые модули
|
|
//------------------------------------------------------------------------------------------------------
|
|
//----- Обратные ссылки на основной файл проекта
|
|
#include "LIP_Ref_5_v1.006.mqh"
|
|
//============================================================================================= MQL5 ===
|
|
// EVENT PROCESSING MODULE
|
|
//------------------------------------------------------------------------------------------------------
|
|
//
|
|
//============================================================================================= MQL5 ===
|
|
// On_Init() - инициализация советника
|
|
//------------------------------------------------------------------------------------------------------
|
|
ENUM_INIT_RETCODE On_Init()
|
|
{
|
|
//----- Счетчики и настройки счетчиков
|
|
gnTick=0;
|
|
gInTimer=false;
|
|
//----- Определяем имя программы
|
|
ProgramName=MQLInfoString(MQL_PROGRAM_NAME);
|
|
//----- Рассчитываем короткое имя индикатора
|
|
ChartID_Str=IntegerToString(ChartID());
|
|
IndicatorShortName=vers+" "+StringSubstr(ChartID_Str,StringLen(ChartID_Str)-3);
|
|
IndicatorSetString(INDICATOR_SHORTNAME,IndicatorShortName);
|
|
//----- Глобальные параметры
|
|
TheSymbol=Symbol();
|
|
//----- Настройка массивов
|
|
ArrayResize(inSelectSym,nSymSelectList);
|
|
ArrayResize(inEliminatSym,nSymEliminatList);
|
|
ArrayResize(inSelectMag,nMagSelectList);
|
|
ArrayResize(inEliminatMag,nMagEliminatList);
|
|
ArrayResize(inSelectTick,nTickSelectList);
|
|
ArrayResize(inEliminatTick,nTickEliminatList);
|
|
//----- Настройки для отбора по инструменту
|
|
{switch(SelSym)
|
|
{
|
|
case SelSym_all:
|
|
{
|
|
inSelectSym[0]="";
|
|
break;
|
|
}
|
|
case SelSym_curr:
|
|
{
|
|
inSelectSym[0]=TheSymbol;
|
|
break;
|
|
}
|
|
case SelSym_user:
|
|
{
|
|
inSelectSym[0]=SelectorSymbol;
|
|
break;
|
|
}
|
|
case SelSym_but:
|
|
{
|
|
inEliminatSym[0]=SelectorSymbol;
|
|
break;
|
|
}
|
|
case SelSym_list:
|
|
{
|
|
FillSymSelect(inSelectSym);
|
|
break;
|
|
}
|
|
case SelSym_butlist:
|
|
{
|
|
FillSymEliminat(inEliminatSym);
|
|
break;
|
|
}
|
|
case SelSym_listbutlist:
|
|
{
|
|
FillSymSelect(inSelectSym);
|
|
FillSymEliminat(inEliminatSym);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
inSelectSym[0]="";
|
|
}
|
|
}}//switch(SelSym)
|
|
//----- Настройки для отбора по магику
|
|
{switch(SelMag)
|
|
{
|
|
case SelMag_all:
|
|
{
|
|
inSelectMag[0]=0;
|
|
break;
|
|
}
|
|
case SelMag_user:
|
|
{
|
|
inSelectMag[0]=SelectorMagic;
|
|
break;
|
|
}
|
|
case SelMag_but:
|
|
{
|
|
inEliminatMag[0]=SelectorMagic;
|
|
break;
|
|
}
|
|
case SelMag_list:
|
|
{
|
|
FillMagSelect(inSelectMag);
|
|
break;
|
|
}
|
|
case SelMag_butlist:
|
|
{
|
|
FillMagEliminat(inEliminatMag);
|
|
break;
|
|
}
|
|
case SelMag_listbutlist:
|
|
{
|
|
FillMagSelect(inSelectMag);
|
|
FillMagEliminat(inEliminatMag);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
inSelectMag[0]=0;
|
|
}
|
|
}}//switch(SelMag)
|
|
//----- Настройки для отбора по тикету
|
|
{switch(SelTick)
|
|
{
|
|
case SelTick_all:
|
|
{
|
|
inSelectTick[0]=0;
|
|
break;
|
|
}
|
|
case SelTick_user:
|
|
{
|
|
inSelectTick[0]=SelectorTicket;
|
|
break;
|
|
}
|
|
case SelTick_but:
|
|
{
|
|
inEliminatTick[0]=SelectorTicket;
|
|
break;
|
|
}
|
|
case SelTick_list:
|
|
{
|
|
FillTickSelect(inSelectTick);
|
|
break;
|
|
}
|
|
case SelTick_butlist:
|
|
{
|
|
FillTickEliminat(inEliminatTick);
|
|
break;
|
|
}
|
|
case SelTick_listbutlist:
|
|
{
|
|
FillTickSelect(inSelectTick);
|
|
FillTickEliminat(inEliminatTick);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
inSelectTick[0]=0;
|
|
}
|
|
}}//switch(SelMag)
|
|
//----- Настройки таймера
|
|
{if(!MQLInfoInteger(MQL_TESTER)) //Не тестирование
|
|
{
|
|
int err=-1;
|
|
int count=50;
|
|
{while((err!=0)&&(count>0))
|
|
{
|
|
ResetLastError();
|
|
EventSetMillisecondTimer(SetMSTimer); //Установка таймера XXX миллисекунд
|
|
err=GetLastError();
|
|
{if(err!=0)
|
|
{
|
|
Sleep(50);
|
|
Print("EventSetMillisecondTimer n=",count," err >>",err);
|
|
}}//if(err!=0)
|
|
count--;
|
|
}}//while((err!=0)&&(count>0))
|
|
}}//if(!MQLInfoInteger(MQL_TESTER))
|
|
//----- Установка и расчет параметров окна индикатора
|
|
IndicatorSetInteger(INDICATOR_DIGITS,0);
|
|
nSubWindow=ChartWindowFind(0,IndicatorShortName); //Что странно, ожидалось что будет работать ProgramName
|
|
IndHeigh=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,nSubWindow);
|
|
IndicatorSetDouble(INDICATOR_MINIMUM,0.0);
|
|
IndicatorSetDouble(INDICATOR_MAXIMUM,IndHeigh);
|
|
nFirstBar=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
|
|
kScale=((ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)>0) //Расчет масштаба графика (баров на пиксел)
|
|
?((double)ChartGetInteger(0,CHART_WIDTH_IN_BARS)/ChartGetInteger(0,CHART_WIDTH_IN_PIXELS))
|
|
:(1));
|
|
//----- Запрашиваем историю сделок и ордеров за указанный период серверного времени.
|
|
{if(!HistorySelect(0,TimeCurrent()))
|
|
{
|
|
Print("HistorySelect Error!");
|
|
return(INIT_FAILED);
|
|
}}//Если неудачно - выходим
|
|
//----- Определение количества ордеров, сделок, позиций. Создание графических объектов.
|
|
nColo=0; //Счетчик колонок вывода
|
|
//----- Открытые позиции
|
|
{if(PositionsView)
|
|
{
|
|
Positions_Total=PositionsTotal(); //Текущие позиции
|
|
Sel_Positions_Total=CalcPositionsTotal(inSelectSym,inEliminatSym,SelSym, //Текущие позиции отобранные
|
|
inSelectMag,inEliminatMag,SelMag,
|
|
inSelectTick,inEliminatTick,SelTick);
|
|
CreateColoLabel("LIP",ColoStep*nColo,
|
|
"Position="+IntegerToString(Sel_Positions_Total)+"/"+IntegerToString(Positions_Total));//Создаём графический объект заголовка колонки
|
|
CreateColo("LIP",ColoStep*nColo,Positions_Total); //Создаём графический объект для колонки позиций
|
|
Positions_Total_Old=Positions_Total; //Текущие позиции в буфер
|
|
Sel_Positions_Total_Old=Sel_Positions_Total; //Текущие позиции отобранные в буфер
|
|
nColo++;
|
|
}}//if(PositionsView)
|
|
//----- Позиции в истории
|
|
{if(PositionsHistoryView)
|
|
{
|
|
//Positions_Total=PositionsTotal(); //Текущие позиции
|
|
//Sel_Positions_Total=CalcPositionsTotal(inSelectSym,inEliminatSym,SelSym, //Текущие позиции отобранные
|
|
// inSelectMag,inEliminatMag,SelMag,
|
|
// inSelectTick,inEliminatTick,SelTick);
|
|
CreateColoLabel("LHP",ColoStep*nColo,
|
|
"PositionHistory="); //Создаём графический объект заголовка колонки
|
|
CreateColo("LHP",ColoStep*nColo,1); //Создаём графический объект для колонки позиций
|
|
//Positions_Total_Old=Positions_Total; //Текущие позиции в буфер
|
|
//Sel_Positions_Total_Old=Sel_Positions_Total; //Текущие позиции отобранные в буфер
|
|
nColo++;
|
|
}}//if(PositionsView)
|
|
//----- Открытые отложенные ордера
|
|
{if(OrdersView)
|
|
{
|
|
Orders_Total=OrdersTotal(); //Текущие лимитные ордера
|
|
Sel_Orders_Total=CalcOrdersTotal(inSelectSym,inEliminatSym,SelSym, //Текущие лимитные ордера отобранные
|
|
inSelectMag,inEliminatMag,SelMag,
|
|
inSelectTick,inEliminatTick,SelTick);
|
|
CreateColoLabel("LIO",ColoStep*nColo, //Создаём графический объект заголовка колонки
|
|
"Order="+IntegerToString(Sel_Orders_Total)+"/"+IntegerToString(Orders_Total));
|
|
CreateColo("LIO",ColoStep*nColo,Orders_Total); //Создаём графический объект для колонки ордеров
|
|
Orders_Total_Old=Orders_Total; //Текущие лимитные ордера в буфер
|
|
Sel_Orders_Total_Old=Sel_Orders_Total; //Текущие лимитные ордера отобранные в буфер
|
|
nColo++;
|
|
}}//if(OrdersView)
|
|
//----- Выполненные ордера в истории
|
|
{if(OrdersHistoryView)
|
|
{
|
|
Orders_History_Total=HistoryOrdersTotal(); //Закрытые рыночные ордера
|
|
Sel_Orders_History_Total=CalcHistoryOrdersTotal(inSelectSym,inEliminatSym,SelSym, //Закрытые рыночные ордера отобранные
|
|
inSelectMag,inEliminatMag,SelMag,
|
|
inSelectTick,inEliminatTick,SelTick);
|
|
CreateColoLabel("LHO",ColoStep*nColo,
|
|
"History_Order="+IntegerToString(Sel_Orders_History_Total)+"/"+IntegerToString(Orders_History_Total));//Создаём графический объект заголовка колонки
|
|
CreateColo("LHO",ColoStep*nColo,Orders_History_Total); //Создаём графический объект для колонки ордеров в истории
|
|
Orders_History_Total_Old=Orders_History_Total; //Закрытые рыночные ордера в буфер
|
|
Sel_Orders_History_Total_Old=Sel_Orders_History_Total; //Закрытые рыночные ордера отобранные в буфер
|
|
nColo++;
|
|
}}//if(OrdersHistoryView)
|
|
//----- Сделки в истории
|
|
{if(DealsHistoryView)
|
|
{
|
|
Deals_History_Total=HistoryDealsTotal(); //Совершенные сделки (выполненные ордера)
|
|
Sel_Deals_History_Total=CalcHistoryDealsTotal(inSelectSym,inEliminatSym,SelSym, //Совершенные сделки (выполненные ордера) отобранные
|
|
inSelectMag,inEliminatMag,SelMag,
|
|
inSelectTick,inEliminatTick,SelTick);
|
|
CreateColoLabel("LHD",ColoStep*nColo,
|
|
"History_Deal="+IntegerToString(Sel_Deals_History_Total)+"/"+IntegerToString(Deals_History_Total));//Создаём графический объект заголовка колонки
|
|
CreateColo("LHD",ColoStep*nColo,Deals_History_Total); //Создаём графический объект для колонки сделок в истории
|
|
Deals_History_Total_Old=Deals_History_Total; //Совершенные сделки (выполненные ордера) в буфер
|
|
Sel_Deals_History_Total_Old=Sel_Deals_History_Total; //Совершенные сделки (выполненные ордера) отобранные в буфер
|
|
nColo++;
|
|
}}//if(DealsHistoryView)
|
|
//-----
|
|
return(INIT_SUCCEEDED);
|
|
}//On_Init()
|
|
//
|
|
//============================================================================================= MQL5 ===
|
|
// On_Tick() - Основной обработчик тиков
|
|
//------------------------------------------------------------------------------------------------------
|
|
void On_Tick()
|
|
{
|
|
//----- Прерываем загрузку, если индикатор уже есть
|
|
{if((ChartWindowFind(0,IndicatorShortName)>=0)&&(ChartWindowFind(0,ProgramName)>=0))
|
|
{
|
|
Print("Abort loading indicator: ",ProgramName);
|
|
ChartIndicatorDelete(0,ChartWindowFind(0,ProgramName),ProgramName);
|
|
}}//if(ChartWindowFind(0,IndicatorShortName)>=0)
|
|
//-----
|
|
//{if(!gInTimer)
|
|
//{
|
|
gnTick++;
|
|
// gInTimer=false;
|
|
//}}//if(!InTimer)
|
|
{if(gnTick>4294967000)
|
|
{
|
|
gnTick=100;
|
|
}}//if(gnTick>4294967000)
|
|
//----- Установка и расчет параметров окна индикатора
|
|
ChartID_Str=IntegerToString(ChartID());
|
|
IndicatorShortName=vers+" "+StringSubstr(ChartID_Str,StringLen(ChartID_Str)-3);
|
|
//ProgramName=MQLInfoString(MQL_PROGRAM_NAME);
|
|
nSubWindow=ChartWindowFind(0,IndicatorShortName);
|
|
IndHeigh=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,nSubWindow);
|
|
IndicatorSetDouble(INDICATOR_MINIMUM,0.0);
|
|
IndicatorSetDouble(INDICATOR_MAXIMUM,IndHeigh);
|
|
nFirstBar=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
|
|
kScale=((ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)>0) //Расчет масштаба графика (баров на пиксел)
|
|
?((double)ChartGetInteger(0,CHART_WIDTH_IN_BARS)/ChartGetInteger(0,CHART_WIDTH_IN_PIXELS))
|
|
:(1));
|
|
//----- Запрашиваем историю сделок и ордеров за указанный период серверного времени.
|
|
{if(!HistorySelect(0,TimeCurrent()))
|
|
{
|
|
Print("HistorySelect Error!");
|
|
return;
|
|
}}//Если неудачно - выходим
|
|
//----- Определение количества ордеров, сделок, позиций. Вывод графических объектов.
|
|
nColo=0; //Счетчик колонок вывода
|
|
//----- Список открытых позиций
|
|
{if(PositionsView)
|
|
{
|
|
Positions_Total=PositionsTotal(); //Текущие позиции
|
|
Sel_Positions_Total=CalcPositionsTotal(inSelectSym,inEliminatSym,SelSym,
|
|
inSelectMag,inEliminatMag,SelMag,
|
|
inSelectTick,inEliminatTick,SelTick); //Текущие позиции отобранные
|
|
{if(Sel_Positions_Total!=Sel_Positions_Total_Old) //Пересчет - перерисовка при изменении количества
|
|
{
|
|
DeleteColo("LIP",Positions_Total_Old); //Колонка позиций
|
|
CreateColo("LIP",ColoStep*nColo,Positions_Total);
|
|
}}//if(Sel_Positions_Total!=Sel_Positions_Total_Old)
|
|
MoveColoLabel( "LIP", //Заголовок колонки
|
|
ColoStep*nColo,
|
|
"Position="+
|
|
IntegerToString(Sel_Positions_Total)+"/"+
|
|
IntegerToString(Positions_Total)+
|
|
((SummView)
|
|
?(" ="+DoubleToString(CalcPositionsSumm(inSelectSym,inEliminatSym,SelSym,
|
|
inSelectMag,inEliminatMag,SelMag,
|
|
inSelectTick,inEliminatTick,SelTick),2)+" ")
|
|
:(""))+
|
|
""
|
|
);
|
|
//-----
|
|
{if(Positions_Total>=0)
|
|
{
|
|
nRow=0;
|
|
CopyTime(TheSymbol,PERIOD_CURRENT,(nFirstBar-(int)((ColoStep*nColo+ColoShift)*kScale)),1,gTime);
|
|
{for(int i=Positions_Total-1;i>=0;i--)
|
|
{
|
|
sTXW="LIP_"+IntegerToString(i); //Устанавливаем имя для текcтового объекта
|
|
ObjectSetString(0,sTXW,OBJPROP_TEXT," "); //Обнуление строки вывода
|
|
ulong Pos_Tick=PositionGetTicket(i); //Выбираем позицию по номеру в списке
|
|
{if(Pos_Tick<=0){continue;}} //Неудачно - следующий
|
|
{if(!CheckSym(PositionGetString(POSITION_SYMBOL),inSelectSym,inEliminatSym,SelSym)){continue;}}//Не тот символ - следующий
|
|
{if(!CheckMag(PositionGetInteger(POSITION_MAGIC),inSelectMag,inEliminatMag,SelMag)){continue;}}//Проверка соответствия магика модели по критерию выбора
|
|
{if(!CheckTick(PositionGetInteger(POSITION_TICKET),inSelectTick,inEliminatTick,SelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора
|
|
ENUM_POSITION_TYPE OrdType=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
|
|
TypeStringPos=EnumToString(OrdType);
|
|
StringReplace(TypeStringPos,"POSITION_TYPE_","");
|
|
DataStringPos= " "+
|
|
IntegerToString(i)+"."+
|
|
PositionGetString(POSITION_SYMBOL)+" "+
|
|
TypeStringPos+" ["+
|
|
IntegerToString(Pos_Tick)+"-"+
|
|
IntegerToString(PositionGetInteger(POSITION_MAGIC))+"-"+
|
|
DoubleToString(PositionGetDouble(POSITION_VOLUME),2)+"-"+
|
|
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),
|
|
(int)SymbolInfoInteger(PositionGetString(POSITION_SYMBOL),SYMBOL_DIGITS))+"]="+
|
|
DoubleToString(PositionGetDouble(POSITION_PROFIT),2)+" "+
|
|
"";
|
|
ResetLastError();
|
|
{if(!ObjectSetInteger(
|
|
0, //Идентификатор чарта
|
|
sTXW, //Имя объекта
|
|
OBJPROP_TIME, //Изменяем координату времени объекта
|
|
gTime[0]
|
|
))
|
|
{
|
|
Print("ObjectSetInteger0 Error=",GetLastError());
|
|
continue;
|
|
}}//if(!ObjectSetInteger(...
|
|
ResetLastError();
|
|
{if(!ObjectSetDouble(
|
|
0, //Идентификатор чарта
|
|
sTXW, //Имя объекта
|
|
OBJPROP_PRICE, //Изменяем координату цены объекта
|
|
IndHeigh-11*(nRow+1)
|
|
))
|
|
{
|
|
Print("ObjectSetDouble0 Error=",GetLastError());
|
|
continue;
|
|
}else{
|
|
nRow++;
|
|
}}//if(!ObjectSetDouble(...
|
|
ObjectSetString(0,sTXW,OBJPROP_TEXT,DataStringPos+"");
|
|
}}//for(int i=Positions_Total-1;i>=0;i--)
|
|
}}//if(Positions_Total>=0)
|
|
//----- Запомним текущие счетчики
|
|
Positions_Total_Old=Positions_Total; //Текущие позиции
|
|
Sel_Positions_Total_Old=Sel_Positions_Total; //Текущие позиции отобранные
|
|
//----- Инкремент счетчика колонок
|
|
nColo++;
|
|
}}//if(PositionsView)
|
|
//----- Список позиций в истории
|
|
//Перебрать сделки - сформировать массив позиций
|
|
{if(PositionsHistoryView)
|
|
{
|
|
Deals_History_Total=HistoryDealsTotal(); //Совершенные сделки (выполненные ордера)
|
|
//Print("407. HistoryDealsTotal()=",Deals_History_Total," TimeCurrent()=",TimeCurrent());
|
|
int nPosition=0;
|
|
Positions_History_Total=0;
|
|
{if(Deals_History_Total>0)
|
|
{
|
|
nPosition=0; //Текущая позиция
|
|
Positions_History_Total=0; //Общее количество позиций
|
|
ArrayResize(Positions,nPosition+1); //Если мы тут, то одна позиция точно есть
|
|
Positions[0].ID=0;
|
|
Positions[0].Symbol="";
|
|
{for(int i=0;i<=Deals_History_Total-1;i++)
|
|
{
|
|
//if(i>0)break;
|
|
ulong Deal_Tick=(ulong)HistoryDealGetTicket(i); //Выбираем сделку по номеру в списке
|
|
{if(Deal_Tick<=0){continue;}} //Неудачно - следующий
|
|
//Print("423. i=",i," Deal_Tick=",Deal_Tick);
|
|
//bool Deal_Select=HistoryDealSelect(Deal_Tick); //Выбираем сделку по тикету сделки
|
|
//--- HistoryDealGetInteger()
|
|
long DealPositionID=HistoryDealGetInteger(Deal_Tick,DEAL_POSITION_ID); //Идентификатор позиции, в открытии, изменении или закрытии которой участвовала эта сделка.
|
|
long DealTicket=HistoryDealGetInteger(Deal_Tick,DEAL_TICKET); //Тикет сделки. Уникальное число, которое присваивается каждой сделке
|
|
long DealOrder=HistoryDealGetInteger(Deal_Tick,DEAL_ORDER); //Ордер, на основание которого выполнена сделка
|
|
datetime DealTime=(datetime)HistoryDealGetInteger(Deal_Tick,DEAL_TIME); //Время совершения сделки
|
|
long DealTimeMSC=HistoryDealGetInteger(Deal_Tick,DEAL_TIME_MSC); //Время совершения сделки в миллисекундах с 01.01.1970
|
|
ENUM_DEAL_TYPE DealType=(ENUM_DEAL_TYPE)HistoryDealGetInteger(Deal_Tick,DEAL_TYPE); //Тип сделки
|
|
ENUM_DEAL_ENTRY DealEntry=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(Deal_Tick,DEAL_ENTRY); //Направление сделки – вход в рынок, выход из рынка или разворот
|
|
long DealMagic=HistoryDealGetInteger(Deal_Tick,DEAL_MAGIC); //Magic number для сделки (смотри ORDER_MAGIC)
|
|
ENUM_DEAL_REASON DealReson=(ENUM_DEAL_REASON) HistoryDealGetInteger(Deal_Tick,DEAL_REASON); //Причина или источник проведения сделки
|
|
//--- HistoryDealGetDouble()
|
|
double DealVolume=HistoryDealGetDouble(Deal_Tick,DEAL_VOLUME); //Объем сделки
|
|
double DealPrice=HistoryDealGetDouble(Deal_Tick,DEAL_PRICE); //Цена сделки
|
|
double DealComission=HistoryDealGetDouble(Deal_Tick,DEAL_COMMISSION); //Комиссия по сделке
|
|
double DealSwap=HistoryDealGetDouble(Deal_Tick,DEAL_SWAP); //Накопленный своп при закрытии
|
|
double DealProfit=HistoryDealGetDouble(Deal_Tick,DEAL_PROFIT); //Финансовый результат сделки
|
|
//--- HistoryDealGetString()
|
|
string DealSymbol=HistoryDealGetString(Deal_Tick,DEAL_SYMBOL); //Имя символа, по которому произведена сделка
|
|
string DealComment=HistoryDealGetString(Deal_Tick,DEAL_COMMENT); //Комментарий к сделке
|
|
string DealExternalID=HistoryDealGetString(Deal_Tick,DEAL_EXTERNAL_ID); //Идентификатор сделки во внешней торговой системе (на бирже)
|
|
//--- Перебор позиций, поиск позиции текущей сделки
|
|
bool PositionNew=true;
|
|
{if(i>0)
|
|
{
|
|
//{for(int j=0;j<=MaxPosition;j++)//тут возможно лучше считать от конца
|
|
{for(int j=Positions_History_Total;j>=0;j--)//тут лучше считать от конца
|
|
{
|
|
//if( true
|
|
// && ((j==4)||(j==5))
|
|
// && (DealTicket==5087854)
|
|
// //&& (DealEntry==DEAL_ENTRY_IN)
|
|
// )
|
|
//Print("450. j=",j,
|
|
// " DealTicket=",DealTicket," DealPositionID=",DealPositionID," DealType=",EnumToString(DealType)," DealEntry=",EnumToString(DealEntry),
|
|
// " ArraySize()=",ArraySize(Positions)," Positions[j].ID=",Positions[j].ID);
|
|
{if(Positions[j].ID==DealPositionID)
|
|
{
|
|
//if(DealTicket==6643501)Print("446. j=",j," DealTicket=",DealTicket," DealPositionID=",DealPositionID," ArraySize()=",ArraySize(Positions)," Positions[j].ID=",Positions[j].ID);//7370160
|
|
PositionNew=false;
|
|
nPosition=j;
|
|
break;
|
|
}}//if(Positions[j].ID==DealPositionID)
|
|
}}//for(int j=Positions_History_Total;j>=0;j--)
|
|
}}//if(i>0)
|
|
//--- Обработка новой или ранее найденной позиции
|
|
{if(PositionNew)
|
|
{
|
|
//Обработка вновь найденной позиции
|
|
{if(i>0)
|
|
{
|
|
Positions_History_Total++;
|
|
nPosition=Positions_History_Total;
|
|
ArrayResize(Positions,nPosition+1); //Проверить на количество элементов
|
|
}}//if(i>0)
|
|
Positions[nPosition].Profit=0.0;
|
|
Positions[nPosition].Swap=0.0;
|
|
Positions[nPosition].Magic=0;
|
|
{switch(DealEntry)
|
|
{
|
|
case DEAL_ENTRY_IN:
|
|
{
|
|
//Positions[nPosition].Profit=DealProfit;
|
|
Positions[nPosition].Type=DealType;
|
|
Positions[nPosition].Magic=DealMagic;
|
|
Positions[nPosition].VolumeOpen=DealVolume;
|
|
Positions[nPosition].VolumeClose=0;
|
|
Positions[nPosition].PriceOpen=DealPrice;
|
|
break;
|
|
}
|
|
case DEAL_ENTRY_OUT:
|
|
{
|
|
Positions[nPosition].VolumeClose=DealVolume;
|
|
break;
|
|
}
|
|
default: break;
|
|
}}//switch(DealEntry)
|
|
//Print("490. ArraySize()=",ArraySize(Positions));
|
|
}else{
|
|
//Обработка ранее найденной позиции
|
|
{switch(DealEntry)
|
|
{
|
|
case DEAL_ENTRY_IN:
|
|
{
|
|
Positions[nPosition].VolumeOpen+=DealVolume;
|
|
break;
|
|
}
|
|
case DEAL_ENTRY_OUT:
|
|
{
|
|
Positions[nPosition].Magic=DealMagic;
|
|
Positions[nPosition].Profit+=DealProfit;
|
|
Positions[nPosition].Swap+=DealSwap;
|
|
Positions[nPosition].VolumeClose+=DealVolume;
|
|
Positions[nPosition].PriceClose=DealPrice;
|
|
break;
|
|
}
|
|
default: break;
|
|
}}//switch(DealEntry)
|
|
}}//if(PositionNew)
|
|
{if((DealType==DEAL_TYPE_BUY)||(DealType==DEAL_TYPE_SELL))
|
|
{
|
|
Positions[nPosition].Symbol=DealSymbol;
|
|
Positions[nPosition].Magic=DealMagic;
|
|
Positions[nPosition].ID=DealPositionID;
|
|
}else{
|
|
Positions[nPosition].Symbol="BALANCE";
|
|
Positions[nPosition].Magic=0;
|
|
Positions[nPosition].ID=0;
|
|
}}//if((DealType==DEAL_TYPE_BUY)||(DealType==DEAL_TYPE_SELL))
|
|
//if( true
|
|
// //&& (nPosition==5)
|
|
// && (DealTicket==5087854)
|
|
// //&& (DealEntry==DEAL_ENTRY_IN)
|
|
// )
|
|
//Print("505. n=",nPosition," PositionNew=",PositionNew,
|
|
// " DealTicket=",DealTicket," DealPositionID=",DealPositionID," DealType=",EnumToString(DealType)," DealEntry=",EnumToString(DealEntry),
|
|
// " ArraySize()=",ArraySize(Positions)," Positions[n].ID=",Positions[nPosition].ID," Positions[n].Type=",EnumToString(Positions[nPosition].Type));//7370160
|
|
//Print("441. i=",i," HistoryDealsTotal()=",Deals_History_Total," DealPositionID=",DealPositionID," nPosition=",nPosition," Positions[nPosition].Symbol=",Positions[nPosition].Symbol);
|
|
}}//for(int j=Positions_History_Total;j>=0;j--)
|
|
Positions_History_Total++;
|
|
}}//if(Deals_History_Total>0)
|
|
//Закрытые позиции отобранные
|
|
Sel_Positions_History_Total=CalcPositionsHistoryTotal(inSelectSym,inEliminatSym,SelSym,
|
|
inSelectMag,inEliminatMag,SelMag,
|
|
inSelectTick,inEliminatTick,SelTick,
|
|
Positions_History_Total);
|
|
{if(Sel_Positions_History_Total!=Sel_Positions_History_Total_Old) //Пересчет - перерисовка при изменении количества
|
|
{
|
|
DeleteColo("LHP",Positions_History_Total_Old); //Колонка позиций
|
|
CreateColo("LHP",ColoStep*nColo,Positions_History_Total);
|
|
}}//if(Sel_History_Deals_Total!=Sel_History_Deals_Total_Old)
|
|
//-----
|
|
MoveColoLabel( "LHP", //Заголовок колонки
|
|
ColoStep*nColo,
|
|
"PositionHistory="+
|
|
IntegerToString(Sel_Positions_History_Total)+"/"+
|
|
IntegerToString(Positions_History_Total)+
|
|
((SummView)
|
|
?(" ="+DoubleToString(CalcPositionsHistorySumm( inSelectSym,inEliminatSym,SelSym,
|
|
inSelectMag,inEliminatMag,SelMag,
|
|
inSelectTick,inEliminatTick,SelTick,
|
|
Positions_History_Total),2)+" ")
|
|
:(""))+
|
|
""
|
|
);
|
|
//-----
|
|
{if((HistoryDealsTotal()>0)&&(Positions_History_Total>0)) //Тут подумать над условием
|
|
{
|
|
nRow=0;
|
|
CopyTime(TheSymbol,PERIOD_CURRENT,(nFirstBar-(int)((ColoStep*nColo+ColoShift)*kScale)),1,gTime);
|
|
{for(int i=Positions_History_Total-1;i>=0;i--)
|
|
{
|
|
//Print("503. i=",i," ArraySize()=",ArraySize(Positions));
|
|
sTXW="LHP_"+IntegerToString(i); //Устанавливаем имя для текcтового объекта
|
|
ObjectSetString(0,sTXW,OBJPROP_TEXT," "); //Обнуление строки вывода
|
|
{if(!CheckSym(Positions[i].Symbol,inSelectSym,inEliminatSym,SelSym)){continue;}} //Проверка соответствия символа модели по критерию выбора
|
|
{if(!CheckMag(Positions[i].Magic,inSelectMag,inEliminatMag,SelMag)){continue;}} //Проверка соответствия магика модели по критерию выбора
|
|
{if(!CheckTick(Positions[i].ID,inSelectTick,inEliminatTick,SelTick)){continue;}} //Проверка соответствия тикета модели по критерию выбора
|
|
PositionTypeString=EnumToString(Positions[i].Type);
|
|
StringReplace(PositionTypeString,"DEAL_TYPE_","");
|
|
DataStringPos= ""+
|
|
IntegerToString(i)+"."+
|
|
Positions[i].Symbol+" "+
|
|
PositionTypeString+
|
|
"["+
|
|
IntegerToString(Positions[i].ID)+"-"+
|
|
IntegerToString(Positions[i].Magic)+"-"+
|
|
DoubleToString(Positions[i].VolumeOpen,2)+"/"+
|
|
DoubleToString(Positions[i].VolumeClose,2)+"-"+
|
|
DoubleToString(Positions[i].PriceOpen,(int)SymbolInfoInteger(Positions[i].Symbol,SYMBOL_DIGITS))+"/"+
|
|
DoubleToString(Positions[i].PriceClose,(int)SymbolInfoInteger(Positions[i].Symbol,SYMBOL_DIGITS))+
|
|
"]="+
|
|
DoubleToString(Positions[i].Profit,2)+" "+
|
|
"";
|
|
ResetLastError();
|
|
{if(!ObjectSetInteger(
|
|
0, //Идентификатор чарта
|
|
sTXW, //Имя объекта
|
|
OBJPROP_TIME, //Изменяем координату времени объекта
|
|
gTime[0]
|
|
))
|
|
{
|
|
Print("ObjectSetInteger0 Error=",GetLastError());
|
|
continue;
|
|
}}//if(!ObjectSetInteger(...
|
|
ResetLastError();
|
|
{if(!ObjectSetDouble(
|
|
0, //Идентификатор чарта
|
|
sTXW, //Имя объекта
|
|
OBJPROP_PRICE, //Изменяем координату цены объекта
|
|
IndHeigh-11*(nRow+1)
|
|
))
|
|
{
|
|
Print("ObjectSetDouble0 Error=",GetLastError());
|
|
continue;
|
|
}else{
|
|
nRow++;
|
|
}}//if(!ObjectSetDouble(...
|
|
ObjectSetString(0,sTXW,OBJPROP_TEXT,DataStringPos+"");
|
|
}}//for(int i=Positions_History_Total-1;i>=0;i--)
|
|
}}//if((HistoryDealsTotal()>0)&&(Positions_History_Total>0))
|
|
//----- Запомним текущие счетчики
|
|
Positions_History_Total_Old=Positions_History_Total; //Закрытые позиции
|
|
Sel_Positions_History_Total_Old=Sel_Positions_History_Total; //Закрытые позиции отобранные
|
|
//----- Инкремент счетчика колонок
|
|
nColo++;
|
|
}}//if(PositionsHistoryView)
|
|
//----- Список открытых отложенных ордеров
|
|
{if(OrdersView)
|
|
{
|
|
Orders_Total=OrdersTotal(); //Текущие лимитные ордера
|
|
Sel_Orders_Total=CalcOrdersTotal(inSelectSym,inEliminatSym,SelSym,
|
|
inSelectMag,inEliminatMag,SelMag,
|
|
inSelectTick,inEliminatTick,SelTick); //Текущие лимитные ордера отобранные
|
|
{if(Sel_Orders_Total!=Sel_Orders_Total_Old) //Пересчет - перерисовка при изменении количества
|
|
{
|
|
DeleteColo("LIO",Orders_Total_Old); //Колонка ордеров
|
|
CreateColo("LIO",ColoStep*nColo,Orders_Total);
|
|
}}//if(Sel_Orders_Total!=Sel_Orders_Total_Old)
|
|
MoveColoLabel("LIO",ColoStep*nColo,"Order="+IntegerToString(Sel_Orders_Total)+"/"+IntegerToString(Orders_Total));//Заголовок колонки
|
|
//-----
|
|
{if(Orders_Total>=0)
|
|
{
|
|
nRow=0;
|
|
CopyTime(TheSymbol,PERIOD_CURRENT,(nFirstBar-(int)((ColoStep*nColo+ColoShift)*kScale)),1,gTime);
|
|
{for(int i=Orders_Total-1;i>=0;i--)
|
|
{
|
|
sTXW="LIO_"+IntegerToString(i); //Устанавливаем имя для текcтового объекта
|
|
ObjectSetString(0,sTXW,OBJPROP_TEXT," "); //Обнуление строки вывода
|
|
ulong Ord_Tick=OrderGetTicket(i); //Выбираем ордер по номеру в списке
|
|
{if(Ord_Tick<=0){continue;}} //Неудачно - следующий
|
|
{if(!CheckSym(OrderGetString(ORDER_SYMBOL),inSelectSym,inEliminatSym,SelSym)){continue;}} //Не тот символ - следующий
|
|
{if(!CheckMag(OrderGetInteger(ORDER_MAGIC),inSelectMag,inEliminatMag,SelMag)){continue;}} //Проверка соответствия магика модели по критерию выбора
|
|
{if(!CheckTick(OrderGetInteger(ORDER_TICKET),inSelectTick,inEliminatTick,SelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора
|
|
ENUM_ORDER_TYPE OrdType=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
|
|
TypeStringOrd=EnumToString(OrdType);
|
|
StringReplace(TypeStringOrd,"ORDER_TYPE_","");
|
|
DataStringOrd= " "+
|
|
IntegerToString(i)+"."+
|
|
OrderGetString(ORDER_SYMBOL)+" "+
|
|
TypeStringOrd+" ["+
|
|
IntegerToString(Ord_Tick)+"-"+
|
|
IntegerToString(OrderGetInteger(ORDER_MAGIC))+"-"+
|
|
DoubleToString(OrderGetDouble(ORDER_VOLUME_CURRENT),2)+"-"+
|
|
DoubleToString(OrderGetDouble(ORDER_PRICE_OPEN),(int)SymbolInfoInteger(OrderGetString(ORDER_SYMBOL),SYMBOL_DIGITS))+"]"+
|
|
"";
|
|
ResetLastError();
|
|
{if(!ObjectSetInteger(
|
|
0, //Идентификатор чарта
|
|
sTXW, //Имя объекта
|
|
OBJPROP_TIME, //Изменяем координату времени объекта
|
|
gTime[0]
|
|
))
|
|
{
|
|
Print("ObjectSetInteger1 Error=",GetLastError());
|
|
continue;
|
|
}}//if(!ObjectSetInteger(...
|
|
ResetLastError();
|
|
{if(!ObjectSetDouble(
|
|
0, //Идентификатор чарта
|
|
sTXW, //Имя объекта
|
|
OBJPROP_PRICE, //Изменяем координату цены объекта
|
|
IndHeigh-11*(nRow+1)
|
|
))
|
|
{
|
|
Print("ObjectSetDouble1 Error=",GetLastError());
|
|
continue;
|
|
}else{
|
|
nRow++;
|
|
}}//if(!ObjectSetDouble(...
|
|
ObjectSetString(0,sTXW,OBJPROP_TEXT,DataStringOrd+"");
|
|
}}//for(int i=Orders_Total-1;i>=0;i--)
|
|
}}//if(Orders_Total>=0)
|
|
//----- Запомним текущие счетчики
|
|
Orders_Total_Old=Orders_Total; //Текущие лимитные ордера
|
|
Sel_Orders_Total_Old=Sel_Orders_Total; //Текущие лимитные ордера отобранные
|
|
//----- Инкремент счетчика колонок
|
|
nColo++;
|
|
}}//if(OrdersView)
|
|
//----- Список ордеров в истории
|
|
{if(OrdersHistoryView)
|
|
{
|
|
Orders_History_Total=HistoryOrdersTotal(); //Закрытые рыночные ордера
|
|
Sel_Orders_History_Total=CalcHistoryOrdersTotal(inSelectSym,inEliminatSym,SelSym,
|
|
inSelectMag,inEliminatMag,SelMag,
|
|
inSelectTick,inEliminatTick,SelTick); //Закрытые рыночные ордера отобранные
|
|
{if(Sel_Orders_History_Total!=Sel_Orders_History_Total_Old) //Пересчет - перерисовка при изменении количества
|
|
{
|
|
DeleteColo("LHO",Orders_History_Total_Old); //Колонка истории ордеров
|
|
CreateColo("LHO",ColoStep*nColo,Orders_History_Total);
|
|
}}//if(Sel_History_Orders_Total!=Sel_History_Orders_Total_Old)
|
|
MoveColoLabel("LHO",ColoStep*nColo,"History Order="+IntegerToString(Sel_Orders_History_Total)+"/"+IntegerToString(Orders_History_Total));//Заголовок колонки
|
|
//-----
|
|
{if(Orders_History_Total>=0)
|
|
{
|
|
nRow=0;
|
|
CopyTime(TheSymbol,PERIOD_CURRENT,(nFirstBar-(int)((ColoStep*nColo+ColoShift)*kScale)),1,gTime);
|
|
{for(int i=Orders_History_Total-1;i>=0;i--)
|
|
{
|
|
sTXW="LHO_"+IntegerToString(i); //Устанавливаем имя для текcтового объекта
|
|
ObjectSetString(0,sTXW,OBJPROP_TEXT," "); //Обнуление строки вывода
|
|
ulong Ord_Tick=HistoryOrderGetTicket(i); //Выбираем ордер по номеру в списке
|
|
{if(Ord_Tick<=0){continue;}} //Неудачно - следующий
|
|
{if(!CheckSym(HistoryOrderGetString(Ord_Tick,ORDER_SYMBOL),inSelectSym,inEliminatSym,SelSym)){continue;}}//Не тот символ - следующий
|
|
{if(!CheckMag(HistoryOrderGetInteger(Ord_Tick,ORDER_MAGIC),inSelectMag,inEliminatMag,SelMag)){continue;}}//Проверка соответствия магика модели по критерию выбора
|
|
{if(!CheckTick(HistoryOrderGetInteger(Ord_Tick,ORDER_TICKET),inSelectTick,inEliminatTick,SelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора
|
|
ENUM_ORDER_TYPE OrdType=(ENUM_ORDER_TYPE)HistoryOrderGetInteger(Ord_Tick,ORDER_TYPE);
|
|
TypeStringOrd=EnumToString(OrdType);
|
|
StringReplace(TypeStringOrd,"ORDER_TYPE_","");
|
|
DataStringOrd= " "+
|
|
IntegerToString(i)+"."+
|
|
HistoryOrderGetString(Ord_Tick,ORDER_SYMBOL)+" "+
|
|
TypeStringOrd+" ["+
|
|
IntegerToString(Ord_Tick)+"-"+
|
|
IntegerToString(HistoryOrderGetInteger(Ord_Tick,ORDER_MAGIC))+"-"+
|
|
DoubleToString(HistoryOrderGetDouble(Ord_Tick,ORDER_VOLUME_INITIAL),2)+"-"+
|
|
DoubleToString(HistoryOrderGetDouble(Ord_Tick,ORDER_PRICE_OPEN),
|
|
(int)SymbolInfoInteger(HistoryOrderGetString(Ord_Tick,ORDER_SYMBOL),SYMBOL_DIGITS))+"]"+
|
|
"";
|
|
ResetLastError();
|
|
{if(!ObjectSetInteger(
|
|
0, //Идентификатор чарта
|
|
sTXW, //Имя объекта
|
|
OBJPROP_TIME, //Изменяем координату времени объекта
|
|
gTime[0]
|
|
))
|
|
{
|
|
Print("ObjectSetInteger2 Error=",GetLastError());
|
|
continue;
|
|
}}//if(!ObjectSetInteger(...
|
|
ResetLastError();
|
|
{if(!ObjectSetDouble(
|
|
0, //Идентификатор чарта
|
|
sTXW, //Имя объекта
|
|
OBJPROP_PRICE, //Изменяем координату цены объекта
|
|
IndHeigh-11*(nRow+1)
|
|
))
|
|
{
|
|
Print("ObjectSetDouble2 Error=",GetLastError());
|
|
continue;
|
|
}else{
|
|
nRow++;
|
|
}}//if(!ObjectSetDouble(...
|
|
ObjectSetString(0,sTXW,OBJPROP_TEXT,DataStringOrd+"");
|
|
}}//for(int i=History_Orders_Total-1;i>=0;i--)
|
|
}}//if(History_Orders_Total>=0)
|
|
//----- Запомним текущие счетчики
|
|
Orders_History_Total_Old=Orders_History_Total; //Закрытые рыночные ордера
|
|
Sel_Orders_History_Total_Old=Sel_Orders_History_Total; //Закрытые рыночные ордера отобранные
|
|
//----- Инкремент счетчика колонок
|
|
nColo++;
|
|
}}//if(OrdersHistoryView)
|
|
//----- Список сделок в истории
|
|
{if(DealsHistoryView)
|
|
{
|
|
Deals_History_Total=HistoryDealsTotal(); //Совершенные сделки (выполненные ордера)
|
|
Sel_Deals_History_Total=CalcHistoryDealsTotal(inSelectSym,inEliminatSym,SelSym,
|
|
inSelectMag,inEliminatMag,SelMag,
|
|
inSelectTick,inEliminatTick,SelTick); //Совершенные сделки (выполненные ордера) отобранные
|
|
{if(Sel_Deals_History_Total!=Sel_Deals_History_Total_Old) //Пересчет - перерисовка при изменении количества
|
|
{
|
|
DeleteColo("LHD",Deals_History_Total_Old); //Колонка истории позиций
|
|
CreateColo("LHD",ColoStep*nColo,Deals_History_Total);
|
|
}}//if(Sel_History_Deals_Total!=Sel_History_Deals_Total_Old)
|
|
MoveColoLabel( "LHD", //Заголовок колонки
|
|
ColoStep*nColo,
|
|
"History Dial="+
|
|
IntegerToString(Sel_Deals_History_Total)+"/"+
|
|
IntegerToString(Deals_History_Total)+
|
|
((SummView)
|
|
?(" ="+DoubleToString(CalcHistoryDealsSumm( inSelectSym,inEliminatSym,SelSym,
|
|
inSelectMag,inEliminatMag,SelMag,
|
|
inSelectTick,inEliminatTick,SelTick),2)+" ")
|
|
:(""))+
|
|
""
|
|
);
|
|
//-----
|
|
{if(Deals_History_Total>=0)
|
|
{
|
|
nRow=0;
|
|
CopyTime(TheSymbol,PERIOD_CURRENT,(nFirstBar-(int)((ColoStep*nColo+ColoShift)*kScale)),1,gTime);
|
|
{for(int i=Deals_History_Total-1;i>=0;i--)
|
|
{
|
|
sTXW="LHD_"+IntegerToString(i); //Устанавливаем имя для текcтового объекта
|
|
ObjectSetString(0,sTXW,OBJPROP_TEXT," "); //Обнуление строки вывода
|
|
ulong Deal_Tick=HistoryDealGetTicket(i); //Выбираем ордер по номеру в списке
|
|
{if(Deal_Tick<=0){continue;}} //Неудачно - следующий
|
|
{if(!CheckSym(HistoryDealGetString(Deal_Tick,DEAL_SYMBOL),inSelectSym,inEliminatSym,SelSym)){continue;}}//Не тот символ - следующий
|
|
{if(!CheckMag(HistoryDealGetInteger(Deal_Tick,DEAL_MAGIC),inSelectMag,inEliminatMag,SelMag)){continue;}}//Проверка соответствия магика модели по критерию выбора
|
|
{if(!CheckTick(HistoryDealGetInteger(Deal_Tick,DEAL_TICKET),inSelectTick,inEliminatTick,SelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора
|
|
ENUM_DEAL_TYPE DealType=(ENUM_DEAL_TYPE)HistoryDealGetInteger(Deal_Tick,DEAL_TYPE);
|
|
DealTypeString=EnumToString(DealType);
|
|
StringReplace(DealTypeString,"DEAL_TYPE_","");
|
|
DataStringDeal= " "+
|
|
IntegerToString(i)+"."+
|
|
HistoryDealGetString(Deal_Tick,DEAL_SYMBOL)+" "+
|
|
DealTypeString+" ["+
|
|
IntegerToString(Deal_Tick)+"-"+
|
|
IntegerToString(HistoryDealGetInteger(Deal_Tick,DEAL_MAGIC))+"-"+
|
|
DoubleToString(HistoryDealGetDouble(Deal_Tick,DEAL_VOLUME),2)+"-"+
|
|
DoubleToString(HistoryDealGetDouble(Deal_Tick,DEAL_PRICE),
|
|
(int)SymbolInfoInteger(HistoryDealGetString(Deal_Tick,DEAL_SYMBOL),SYMBOL_DIGITS))+"]="+
|
|
DoubleToString(HistoryDealGetDouble(Deal_Tick,DEAL_PROFIT),2)+" "+
|
|
IntegerToString(HistoryDealGetInteger(Deal_Tick,DEAL_POSITION_ID))+" "+ //Идентификатор позиции, в открытии, изменении или закрытии которой участвовала эта сделка.
|
|
"";
|
|
ResetLastError();
|
|
{if(!ObjectSetInteger(
|
|
0, //Идентификатор чарта
|
|
sTXW, //Имя объекта
|
|
OBJPROP_TIME, //Изменяем координату времени объекта
|
|
gTime[0]
|
|
))
|
|
{
|
|
Print("ObjectSetInteger3 Error=",GetLastError());
|
|
continue;
|
|
}}//if(!ObjectSetInteger(...
|
|
ResetLastError();
|
|
{if(!ObjectSetDouble(
|
|
0, //Идентификатор чарта
|
|
sTXW, //Имя объекта
|
|
OBJPROP_PRICE, //Изменяем координату цены объекта
|
|
IndHeigh-11*(nRow+1)
|
|
))
|
|
{
|
|
Print("ObjectSetDouble3 Error=",GetLastError());
|
|
continue;
|
|
}else{
|
|
nRow++;
|
|
}}//if(!ObjectSetDouble(...
|
|
ObjectSetString(0,sTXW,OBJPROP_TEXT,DataStringDeal+"");
|
|
}}//for(int i=History_Deals_Total-1;i>=0;i--)
|
|
}}//if(History_Deals_Total>=0)
|
|
//----- Запомним текущие счетчики
|
|
Deals_History_Total_Old=Deals_History_Total; //Совершенные сделки (выполненные ордера)
|
|
Sel_Deals_History_Total_Old=Sel_Deals_History_Total; //Совершенные сделки (выполненные ордера) отобранные
|
|
//----- Инкремент счетчика колонок
|
|
nColo++;
|
|
}}//if(DealsHistoryView)
|
|
//----- Формируем строку комментария на чарте
|
|
{if(CommentView)
|
|
{
|
|
CommentLine[0]=""+
|
|
"PositionsTotal="+IntegerToString(Positions_Total)+" "+
|
|
"OrdersTotal="+IntegerToString(Orders_Total)+" "+
|
|
"";
|
|
CommentLine[1]=""+
|
|
"PositionsHistoryTotal="+IntegerToString(Positions_History_Total)+" "+
|
|
"OrdersHistoryTotal="+IntegerToString(Orders_History_Total)+" "+
|
|
"DealsHistoryTotal="+IntegerToString(Deals_History_Total)+" "+
|
|
"";
|
|
Comment( CommentLine[0]+" "+CommentLine[1]+" "+
|
|
(string)(datetime)(TimeCurrent()-ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0)*PeriodSeconds(PERIOD_CURRENT))+" "+
|
|
_n+"Ticks>>"+IntegerToString(gnTick)+" Tims>>"+IntegerToString(gnTimer));
|
|
}}//if(CommentView)
|
|
//----- Перерисовка чарта
|
|
ChartRedraw();
|
|
//-----
|
|
return;
|
|
}//On_Tick()
|
|
//
|
|
//============================================================================================= MQL5 ===
|
|
// On_Timer - Обработка событий по таймеру
|
|
//------------------------------------------------------------------------------------------------------
|
|
void On_Timer()
|
|
{
|
|
//-----
|
|
gnTimer++;
|
|
{if(gnTimer>4294967000)
|
|
{
|
|
gnTimer=100;
|
|
}}//if(gnTimer>4294967000)
|
|
gInTimer=true;
|
|
On_Tick();
|
|
}//On_Timer()
|