Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Если распаковать приложенный архив, то структура файлов создается таким образом, что компиляция программы должна проходить нормально.
Дело ваше, я просто дал совет.
Дело ваше, я просто дал совет.
Спасибо! Я ценю любые советы и замечания. Они позволяют взглянуть на своё чужими глазами.
Спасибо! Я ценю любые советы и замечания. Они позволяют взглянуть на своё чужими глазами.
Да, иногда самому что-то кажется очевидным, а другим нет. Тут куча людей, которые даже советник на график не могут поставить, для них нестандартные решения смерти подобны.
Я давно рассылаю клиентам zip в виде запакованной папки MQL4 или MQL5, откуда удалено все лишнее. Тогда действительно можно просто распаковать и не думать, что где должно лежать.
Лишней работы на 3 минуты, зато потом экономишь часы на нудные объяснения.
Доработанная версия.
Добавлено:
1. Автоматический расчет размера списков.
2. Запрет запуска двух индикаторов на одном графике.
3. Устранены обнаруженные недочеты.
Основная программа:
Определения переменных:
Интерфейс настроек:
Главный алгоритм:
//============================================================================================= MQL5 === // LibreInfoPDO Main_5 v1.001 MQL5 // Модуль обработки событий // LibreCoin (c)2014-2017 //====================================================================================================== #property strict //============================================================================================= MQL5 === // INCLUDE - подключаемые модули //------------------------------------------------------------------------------------------------------ //----- Обратные ссылки на основной файл проекта #include "LIP_Ref_5_v1.001.mqh" //============================================================================================= MQL5 === // EVENT PROCESSING MODULE //------------------------------------------------------------------------------------------------------ // //============================================================================================= MQL5 === // On_Init() - инициализация советника //------------------------------------------------------------------------------------------------------ int On_Init(){ gnTick=0; IndicatorSetInteger(INDICATOR_DIGITS,0); //----- Определяем имя программы ProgramName=MQLInfoString(MQL_PROGRAM_NAME); //----- Рассчитываем короткое имя индикатора ChartID_Str=IntegerToString(ChartID()); IndicatorShortName=vers+" "+StringSubstr(ChartID_Str,StringLen(ChartID_Str)-3); IndicatorSetString(INDICATOR_SHORTNAME,IndicatorShortName); //----- Устанавливаем короткое имя индикатора gInTimer=false; TheSymbol=Symbol(); //----- Настройки для отбора по инструменту {switch(SymSel) { case SymSel_curr: { inSymbolSelector=TheSymbol; break; } case SymSel_user: { inSymbolSelector=SymbolSelector; break; } case SymSel_all: { inSymbolSelector=""; break; } default: { inSymbolSelector=""; } }}//switch(SymSel) //----- Настройки таймера и глобальных счетчиков //onTimer=false; //флаг нахождения в обработчике таймера - для блокировки других обработчиков MSTimerSet=200; //Установка таймера XXX миллисекунд {if(!MQLInfoInteger(MQL_TESTER))//Не тестирование { int err=-1; int count=50; {while((err!=0)&&(count>0)) { ResetLastError(); EventSetMillisecondTimer(MSTimerSet); //Установка таймера 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)) //----- IndHeigh=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,1); IndicatorSetDouble(INDICATOR_MINIMUM,0.0); IndicatorSetDouble(INDICATOR_MAXIMUM,IndHeigh); //----- TimeToStruct(TimeCurrent(),DateTimeCurrent); DateTimeCurrent.sec=0; TimeCurrentMinutes=StructToTime(DateTimeCurrent); kScale=(double)ChartGetInteger(0,CHART_WIDTH_IN_BARS)/ChartGetInteger(0,CHART_WIDTH_IN_PIXELS); //----- Запрашиваем историю сделок и ордеров за указанный период серверного времени. {if(!HistorySelect(0,TimeCurrent())) { Print("HistorySelect Error!"); return(0); }}//Если неудачно - выходим //----- Определение количества ордеров, сделок, позиций //----- Общее Positions_Total=PositionsTotal(); //Текущие позиции Orders_Total=OrdersTotal(); //Текущие лимитные ордера History_Orders_Total=HistoryOrdersTotal(); //Закрытые рыночные ордера History_Deals_Total=HistoryDealsTotal(); //Совершенные сделки (выполненные ордера) //----- Отобранное Positions_Total_Sel=PositionsTotalSel(inSymbolSelector); //Текущие позиции Orders_Total_Sel=OrdersTotalSel(inSymbolSelector); //Текущие лимитные ордера History_Orders_Total_Sel=HistoryOrdersTotalSel(inSymbolSelector);//Закрытые рыночные ордера History_Deals_Total_Sel=HistoryDealsTotalSel(inSymbolSelector);//Совершенные сделки (выполненные ордера) //----- Открытые позиции ColoLabelCreate("LIP",0,"Position="+IntegerToString(Positions_Total_Sel)+"/"+IntegerToString(Positions_Total)); ColoCreate("LIP",0,Positions_Total); //----- Открытые отложенные ордера ColoLabelCreate("LIO",300,"Order="+IntegerToString(Orders_Total_Sel)+"/"+IntegerToString(Orders_Total)); ColoCreate("LIO",300,Orders_Total); //----- Выполненные ордера в истории ColoLabelCreate("LHO",600,"History_Order="+IntegerToString(History_Orders_Total_Sel)+"/"+IntegerToString(History_Orders_Total)); ColoCreate("LHO",600,History_Orders_Total); //----- Сделки в истории ColoLabelCreate("LHD",900,"History_Deal="+IntegerToString(History_Deals_Total_Sel)+"/"+IntegerToString(History_Deals_Total)); ColoCreate("LHD",900,History_Deals_Total); //----- Запомним текущие количества Orders_Total_Old=Orders_Total; //Текущие лимитные ордера History_Orders_Total_Old=History_Orders_Total; //Закрытые рыночные ордера History_Deals_Total_Old=History_Deals_Total; //Совершенные сделки (выполненные ордера) Positions_Total_Old=Positions_Total; //Текущие позиции Positions_Total_Sel_Old=Positions_Total_Sel; //Текущие позиции Orders_Total_Sel_Old=Orders_Total_Sel; //Текущие лимитные ордера History_Orders_Total_Sel_Old=History_Orders_Total_Sel; //Закрытые рыночные ордера History_Deals_Total_Sel_Old=History_Deals_Total_Sel; //Совершенные сделки (выполненные ордера) //----- 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) //----- IndHeigh=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,1); IndicatorSetDouble(INDICATOR_MINIMUM,0.0); IndicatorSetDouble(INDICATOR_MAXIMUM,IndHeigh); //----- TimeToStruct(TimeCurrent(),DateTimeCurrent); DateTimeCurrent.sec=0; TimeCurrentMinutes=StructToTime(DateTimeCurrent); kScale=(double)ChartGetInteger(0,CHART_WIDTH_IN_BARS)/ChartGetInteger(0,CHART_WIDTH_IN_PIXELS); //----- Запрашиваем историю сделок и ордеров за указанный период серверного времени. {if(!HistorySelect(0,TimeCurrent())) { Print("HistorySelect Error!"); return; }}//Если неудачно - выходим //----- Определение количества ордеров, сделок, позиций //----- Общее Positions_Total=PositionsTotal(); //Текущие позиции Orders_Total=OrdersTotal(); //Текущие лимитные ордера History_Orders_Total=HistoryOrdersTotal(); //Закрытые рыночные ордера History_Deals_Total=HistoryDealsTotal(); //Совершенные сделки (выполненные ордера) //----- Отобранное Positions_Total_Sel=PositionsTotalSel(inSymbolSelector); //Текущие позиции Orders_Total_Sel=OrdersTotalSel(inSymbolSelector); //Текущие лимитные ордера History_Orders_Total_Sel=HistoryOrdersTotalSel(inSymbolSelector);//Закрытые рыночные ордера History_Deals_Total_Sel=HistoryDealsTotalSel(inSymbolSelector);//Совершенные сделки (выполненные ордера) //----- CommentLine[0]=""+ "PositionsTotal="+IntegerToString(Positions_Total)+" "+ "OrdersTotal="+IntegerToString(Orders_Total)+" "+ ""; CommentLine[1]=""+ "HistoryOrdersTotal="+IntegerToString(History_Orders_Total)+" "+ "HistoryDealsTotal="+IntegerToString(History_Deals_Total)+" "+ ""; //----- Пересчеты - перерисовки при изменении количества //----- Список открытых позиций {if(Positions_Total_Sel!=Positions_Total_Sel_Old) { ColoDelete("LIP",Positions_Total_Old); //Колонка позиций ColoCreate("LIP",0,Positions_Total); }}//if(Positions_Total_Sel!=Positions_Total_Sel_Old) //----- Список открытых отложенных ордеров {if(Orders_Total_Sel!=Orders_Total_Sel_Old) { ColoDelete("LIO",Orders_Total_Old); //Колонка ордеров ColoCreate("LIO",300,Orders_Total); }}//if(Orders_Total_Sel!=Orders_Total_Sel_Old) //----- Список ордеров в истории {if(History_Orders_Total_Sel!=History_Orders_Total_Sel_Old) { ColoDelete("LHO",Orders_Total); //Колонка истории ордеров ColoCreate("LHO",600,Orders_Total); }}//if(Positions_Total_Sel!=Positions_Total_Sel_Old) //----- Список сделок в истории {if(History_Deals_Total_Sel!=History_Deals_Total_Sel_Old) { ColoDelete("LHD",History_Deals_Total_Old); //Колонка истории позиций ColoCreate("LHD",900,History_Deals_Total); }}//if(Positions_Total_Sel!=Positions_Total_Sel_Old) //----- Заголовки колонок ColoLabelMove("LIP",0,"Position="+IntegerToString(Positions_Total_Sel)+"/"+IntegerToString(Positions_Total)); ColoLabelMove("LIO",300,"Order="+IntegerToString(Orders_Total_Sel)+"/"+IntegerToString(Orders_Total)); ColoLabelMove("LHO",600,"History Order="+IntegerToString(History_Orders_Total_Sel)+"/"+IntegerToString(History_Orders_Total)); ColoLabelMove("LHD",900,"History Dial="+IntegerToString(History_Deals_Total_Sel)+"/"+IntegerToString(History_Deals_Total)); //----- Формирование списков ордеров, сделок, позиций //----- Список открытых позиций {if(Positions_Total>=0) { nRow=0; {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((SymSel!=SymSel_all)&&(inSymbolSelector!=PositionGetString(POSITION_SYMBOL))){continue;}}//Не тот символ - следующий ENUM_POSITION_TYPE OrdType=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); PosTypeString=EnumToString(OrdType); StringReplace(PosTypeString,"POSITION_TYPE_",""); PositionDataString= " "+ IntegerToString(i)+"."+ PositionGetString(POSITION_SYMBOL)+" "+ PosTypeString+" ["+ 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, //Изменяем координату времени объекта (datetime)(TimeCurrentMinutes-(-3*kScale+ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1))*PeriodSeconds(PERIOD_CURRENT)) )) { 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,PositionDataString+""); }}//for(int i=1;i<=nOrderList;i++) }}//if(Positions_Total>=0) //----- Список открытых отложенных ордеров {if(Orders_Total>=0) { nRow=0; {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((SymSel!=SymSel_all)&&(inSymbolSelector!=OrderGetString(ORDER_SYMBOL))){continue;}}//Не тот символ - следующий ENUM_ORDER_TYPE OrdType=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); OrdTypeString=EnumToString(OrdType); StringReplace(OrdTypeString,"ORDER_TYPE_",""); OrderDataString= " "+ IntegerToString(i)+"."+ OrderGetString(ORDER_SYMBOL)+" "+ OrdTypeString+" ["+ 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, //Изменяем координату времени объекта (datetime)(TimeCurrentMinutes-(ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1)-300*kScale)*PeriodSeconds(PERIOD_CURRENT))//CHART_WIDTH_IN_PIXELS CHART_WIDTH_IN_BARS )) { 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,OrderDataString+""); }}//for(int i=Orders_Total-1;i>=0;i--) }}//if(Orders_Total>=0) //----- Список ордеров в истории {if(History_Orders_Total>=0) { nRow=0; {for(int i=History_Orders_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((SymSel!=SymSel_all)&&(inSymbolSelector!=HistoryOrderGetString(Ord_Tick,ORDER_SYMBOL))){continue;}}//Не тот символ - следующий ENUM_ORDER_TYPE OrdType=(ENUM_ORDER_TYPE)HistoryOrderGetInteger(Ord_Tick,ORDER_TYPE); OrdTypeString=EnumToString(OrdType); StringReplace(OrdTypeString,"ORDER_TYPE_",""); OrderDataString= " "+ IntegerToString(i)+"."+ HistoryOrderGetString(Ord_Tick,ORDER_SYMBOL)+" "+ OrdTypeString+" ["+ 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))+"]"+ //DoubleToString(HistoryOrderGetDouble(ORDER_PROFIT),2)+" "+ ""; ResetLastError(); {if(!ObjectSetInteger( 0, //Идентификатор чарта sTXW, //Имя объекта OBJPROP_TIME, //Изменяем координату времени объекта (datetime)(TimeCurrentMinutes-(ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1)-600*kScale)*PeriodSeconds(PERIOD_CURRENT)) )) { 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,OrderDataString+""); }}//for(int i=1;i<=nOrderList;i++) }}//if(Positions_Total>=0) //----- Список сделок в истории {if(History_Deals_Total>=0) { nRow=0; {for(int i=History_Deals_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((SymSel!=SymSel_all)&&(inSymbolSelector!=HistoryDealGetString(Deal_Tick,DEAL_SYMBOL))){continue;}}//Не тот символ - следующий ENUM_DEAL_TYPE DealType=(ENUM_DEAL_TYPE)HistoryDealGetInteger(Deal_Tick,DEAL_TYPE); DealTypeString=EnumToString(DealType); StringReplace(DealTypeString,"DEAL_TYPE_",""); DealDataString= " "+ 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)+" "+ ""; ResetLastError(); {if(!ObjectSetInteger( 0, //Идентификатор чарта sTXW, //Имя объекта OBJPROP_TIME, //Изменяем координату времени объекта (datetime)(TimeCurrentMinutes-(ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1)-900*kScale)*PeriodSeconds(PERIOD_CURRENT)) )) { 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,DealDataString+""); }}//for(int i=History_Deals_Total-1;i>=0;i--) }}//if(History_Deals_Total>=0) //----- ChartRedraw(); 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)); //----- Запомним текущие счетчики Orders_Total_Old=Orders_Total; //Текущие лимитные ордера History_Orders_Total_Old=History_Orders_Total; //Закрытые рыночные ордера History_Deals_Total_Old=History_Deals_Total; //Совершенные сделки (выполненные ордера) Positions_Total_Old=Positions_Total; //Текущие позиции Orders_Total_Sel_Old=Orders_Total_Sel; //Текущие лимитные ордера History_Orders_Total_Sel_Old=History_Orders_Total_Sel;//Закрытые рыночные ордера History_Deals_Total_Sel_Old=History_Deals_Total_Sel; //Совершенные сделки (выполненные ордера) Positions_Total_Sel_Old=Positions_Total_Sel; //Текущие позиции //----- return; }//On_Tick() // //============================================================================================= MQL5 === // On_Timer - Обработка событий по таймеру //------------------------------------------------------------------------------------------------------ void On_Timer(){ //----- gnTimer++; {if(gnTimer>4294967000) { gnTimer=100; }}//if(gnTimer>4294967000) gInTimer=true; On_Tick(); }//On_Timer()Основные технические расчеты:
Графика:
Очередная доработка.
Изменения:
1. Изменен расчет горизонтальных координат вывода колонок.
Теперь корректно работает и на рваных по времени графиках.
2. Шаг вывода колонок теперь можно устанавливать в настройках.
3. Интервал таймера теперь можно задавать в настройках.