Вот код и индикатор:
#property copyright "Copyright 2022, Maksim Neimerik" #property link "https://www.mql5.com/ru/users/istrebitel" #property version "1.00" #property strict #resource "\\Indicators\\GFX2.ex4" extern string trade="===Trade Settings===";//===Trade Settings=== extern double Lot_Size=0.01;//Lot Size extern int Magic=777;//Magic Number extern string _Comment="Your Comment";//Comment extern int EntryDelay=2;//Entry Delay (minute) extern bool Time_Filter=true;//Enable Time Filter extern string StartTime="00:00";//Start Time extern string StopTime="23:59";//Stop Time extern string gfx="===GFX2 Settings===";//===GFX2 Settings=== extern double Deviation=1.0; extern int Length=8; extern int MoneyRisk=1; int pb=0,ps=0,x=0; double UpArr=0,DnArr=0; static datetime prevtime,arrowtimeB=0,arrowtimeS=0; MqlDateTime str1,str2; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { EventSetTimer(1); ObjectCreate(0,"Label",OBJ_LABEL,0,0,0); ObjectSetString(0,"Label",OBJPROP_TEXT,"0"); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ObjectDelete("Label"); EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert Timer function | //+------------------------------------------------------------------+ void OnTimer() { x++; ObjectSetString(0,"Label",OBJPROP_TEXT,IntegerToString(x)); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { Run(); } //+------------------------------------------------------------------+ void Run() { if((Time_Filter&&TimeToStr(TimeCurrent(),TIME_MINUTES)>=StartTime&&TimeToStr(TimeCurrent(),TIME_MINUTES)<StopTime)||!Time_Filter) { if(prevtime!=Time[0]) { if(CountOrders(-1)==0) { if(GFX(0,1)!=EMPTY_VALUE&&GFX(0,0)!=EMPTY_VALUE&&GFX(4,0)>GFX(0,0)&&GFX(5,0)>GFX(0,0))OpenOrder(0,Lot_Size); if(GFX(1,1)!=EMPTY_VALUE&&GFX(1,0)!=EMPTY_VALUE&&GFX(4,0)<GFX(1,0)&&GFX(5,0)<GFX(1,0))OpenOrder(1,Lot_Size); } prevtime=Time[0]; } if(CountOrders(-1)==0) { if(GFX(3,0)!=EMPTY_VALUE) { if(pb==0){arrowtimeB=TimeCurrent();pb=1;} if(timer(arrowtimeB))OpenOrder(0,Lot_Size); } else pb=0; if(GFX(2,0)!=EMPTY_VALUE) { if(ps==0){arrowtimeS=TimeCurrent();ps=1;} if(timer(arrowtimeS))OpenOrder(1,Lot_Size); } else ps=0; } } if(CountOrders(0)!=0&&((MathMin(GFX(5,0),GFX(4,0))<=GFX(0,0))||(GFX(1,0)!=EMPTY_VALUE)))CloseOrders(0); if(CountOrders(1)!=0&&((MathMax(GFX(5,0),GFX(4,0))>=GFX(1,0))||(GFX(0,0)!=EMPTY_VALUE)))CloseOrders(1); } //+------------------------------------------------------------------+ void CloseOrders(int cmd) { int n=0; for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic) { RefreshRates(); if(OrderType()==cmd||cmd<0) { if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,clrLimeGreen)) { if(n<10) { i++; n++; } } } } } } } //+------------------------------------------------------------------+ int CountOrders(int cmd) { int res=0; for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic&&(OrderType()==cmd||cmd<0)) res++; } } return(res); } //+------------------------------------------------------------------+ double GFX(int mode,int shift) { double res=0; res=NormalizeDouble(iCustom(_Symbol,PERIOD_CURRENT,"::Indicators\\GFX2.ex4",Deviation,Length,MoneyRisk,clrNONE,clrNONE,clrNONE,clrNONE,mode,shift),_Digits); return(res); } //+------------------------------------------------------------------+ void OpenOrder(int cmd,double lot) { int ticket=0; double Price=0; color clr=0; if(cmd==0) { clr=clrBlue; Price=NormalizeDouble(Ask,_Digits); } if(cmd==1) { clr=clrRed; Price=NormalizeDouble(Bid,_Digits); } ticket=OrderSend(_Symbol,cmd,CheckVolumeValue(NormalizeDouble(lot,2)),Price,10,0,0,"Project_185",Magic,0,clr); if(ticket<0)Print("Order not opened! Error = ",GetLastError(),". Order type=",cmd,", Order Lot=",lot,", Order open price=",Price); } //+------------------------------------------------------------------+ bool timer(datetime t) { bool res=false; TimeToStruct(TimeCurrent(),str1); TimeToStruct(t,str2); if(str1.min-str2.min>=EntryDelay)res=true; return(res); } //+------------------------------------------------------------------+ double CheckVolumeValue(double volume) { double res=volume; double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); if(volume<min_volume) res=min_volume; double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX); if(volume>max_volume) res=max_volume; double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP); int ratio=(int)MathFloor(volume/volume_step); if(MathAbs(ratio*volume_step-volume)>0.0000001) res=NormalizeDouble(ratio*volume_step,2); return(res); }
Почему бы ни вызвать значение индикатора просто через iCustom()?
Я имею ввиду, почему бы ни отказаться от #resource?
Да, это точно! Наверное надо выкинуть его и забыть... Но все же интересно найти причину почуму не работает OnTimer().
Я сегодня круто лоханулся с этим индикатором. Кинул его на М15. Он подгрузился, прорисовался. Я посмотрел-посмотрел, да и переключился на Н4. Покрутил и этот график. Затем сунул его в тестер. Стрелки на нулевой свече могут появляться и исчезать. А по формированию стрелки на первой свече входить уже поздно. Хотя, временами показывает сигналы хорошо. Далее я закрыл тестер и захотел посмотреть его работу на М1. Терминал минут 5-10 пытался что-то посчитать. Затем клик по терминалу выдал сообщение "Программа не отвечает". Я так и не дождался раздупления - выгрузил терминал из оперативы принудительно, грохнул индикатор да и всё. К чему я это? Может очередной тик настолько подвешивает советника, что до события OnTimer() просто не доходит черёд?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Привет всем! Такая проблема: подключил пользовательский индикатор к советнику через #resource, все работает хорошо кроме OnTick(), эта функция тупо не работает. Как только отключаю индикатор - OnTick() начинает работать... Может кто сталкивался с таким?
...И, к сожалению, исходника индикатора нет.