До перемещения метки с ценой горизонтальное положение вычисляется через текущую ширину экрана
x=width -70;
Когда я открываю боковую панель, то метка уезжает вправо за границу экрана. Если нажать на кнопку обновить в журнале видно работу индикатора, но метка не возвращается, она появляется только со второй попытки. Получается что OnCalculate вызывается не каждый раз? Как сделать работу функции постоянной?
До перемещения метки с ценой горизонтальное положение вычисляется через текущую ширину экрана
Когда я открываю боковую панель, то метка уезжает вправо за границу экрана. Если нажать на кнопку обновить в журнале видно работу индикатора, но метка не возвращается, она появляется только со второй попытки. Получается что OnCalculate вызывается не каждый раз? Как сделать работу функции постоянной?
делать опрос и перерисовку в OnChartEvent - CHARTEVENT_CHART_CHANGE
Если индикатор отрисовывает стрелки на графике, и стрелки не являются объектами, то можно ли получить параметры такой отрисовки с самого графика или другим способом? Получить данные из буферов и даже нормально запустить индикатор для тестирования не удается
Если индикатор отрисовывает стрелки на графике, и стрелки не являются объектами, то можно ли получить параметры такой отрисовки с самого графика или другим способом? Получить данные из буферов и даже нормально запустить индикатор для тестирования не удается
Разрешение на работу для советника проверь. И где в принт вывод? Этот кусок кода по-лбому что-то возвращает, раз ошибок нет, значит проблема за пределами этого куска кода. В этом куске разве, что деление на 0 может возникать
Код целиком ? Да, сейчас .
//+------------------------------------------------------------------+//| Stop_Ma_v5.1.mq4 |//| Copyright 2018, axe44 |//| http://axe44.opentraders.ru/bio/ |//+------------------------------------------------------------------+#property copyright"Copyright 2018,@ axe44"#property link"gerchikco.com/registration/?ref=sfaCLYmR"#property version"5.10"#property strict//--- Inputsexterndouble Lots = 0.1; // Lots лотexternbool Z_schet = 1; // Z_schet з-тенденцияexternint Expir = 20; // Expir истечение в часахexterndouble klot = 1.5; // klot - множитель тенденцииexternint StopLoss = 200; // StopLoss лосьexternint TakeProfit = 300; // TakeProfit язьexternint BULevel = 0; // BULevel уровень БУexternint BUPoint = 3; // BUPoint пункты БУexternint Spred = 4; // Spred спред externint TrailingStop = 0; // TrailingStop тралinputENUM_TIMEFRAMES TF1 = PERIOD_M15;//TF1 Время АТРexternint Stop = 14; // Stop Периуд Stop//extern int Atr_Procent = 20; //Atr_Procent Максимальный процент АТР для работыinputENUM_TIMEFRAMES TF2 = PERIOD_M15;//TF2 Время Ма открытия\закрытия //extern int Pr = 50; // Pr Процент разницы движения.externint MA = 14; //MA Периуд MAexternint MaM = 3; //MaM способ расчёта Ма externint StartHour = 0; //StartHour час начала торговлиexternint StartMin = 30; //StartMin минута начала торговлиexternint EndHour = 23; //EndHour час окончания торговлиexternint EndMin = 30; //EndMin минута окончания торговлиexternint Slip = 30; //Slip реквотexternint Magic = 124; //Magic магикexternint TesterMinPercentProfitTrades=50;
externint AutoLot = 1; // автолотdouble atr,ma,rm,pm,minatr,lot,hma,lma,min,max,zn,C,pribul;
double NormalP[302];
int i,count,prom,index,psd,usd;
datetime t=1,day,hour;
bool ww,nn,bb,ss;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---if(Digits==3 || Digits==5)
{
TakeProfit*=10;
StopLoss*=10;
TrailingStop*=10;
BUPoint*=10;
BULevel*=10;
Slip*=10;
Spred*=10;
}
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| расчёт лота |//+------------------------------------------------------------------+double MoneyManagement()
{
double DynamicLot=0;
double Free_Equity=AccountEquity();
if(Free_Equity<=0)return(0);
double TickValue=MarketInfo(Symbol(),MODE_TICKVALUE);
double LotStep=MarketInfo(Symbol(),MODE_LOTSTEP);
double MinLot=MarketInfo(Symbol(),MODE_MINLOT);
double MxLot=MarketInfo(Symbol(),MODE_MAXLOT);
if (TickValue*LotStep!=0) DynamicLot=MathFloor((Free_Equity*MathMin(AutoLot/10,100)/1000)/StopLoss*TickValue/LotStep)*LotStep;
if(DynamicLot<MinLot)DynamicLot=MinLot;
if(DynamicLot>MxLot)DynamicLot=MxLot;
return(DynamicLot);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
Comment("");
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 30.04.2009 |//| Описание : Возвращает флаг разрешения торговли по времени. |//+----------------------------------------------------------------------------+//| Параметры: |//| hb - часы времени начала торговли |//| mb - минуты времени начала торговли |//| he - часы времени окончания торговли |//| me - минуты времени окончания торговли |//+----------------------------------------------------------------------------+bool isTradeTimeInt(int hb=0,int mb=0,int he=0,int me=0)
{
datetime db, de; // Время начала и окончания работыint hc; // Часы текущего времени торгового сервера
db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)hb+":"+(string)mb);
de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)he+":"+(string)me);
hc=TimeHour(TimeCurrent());
if(db>=de)
{
if(hc>=he) de+=24*60*60; else db-=24*60*60;
}
if(TimeCurrent()>=db && TimeCurrent()<=de) return(True);
elsereturn(False);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+void PutOrder(int type,double price)
{
int r=0;
color clr=Green;
double sl=0,tp=0;
if(type==1 || type==3 || type==5)
{
clr=Red;
if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
}
if(type==0 || type==2 || type==4)
{
clr=Blue;
if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
}
if(AutoLot>0){lot=MoneyManagement();}
if(AutoLot<=0){lot=Lots;}
r=OrderSend(NULL,type,lot,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,TimeCurrent()+Expir*60*60,clr);
return;
}
//+------------------------------------------------------------------+//| история |//+------------------------------------------------------------------+double history()
{
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
pribul=OrderProfit();
}
return(pribul);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int CountOrders(int type)
{
count=0;
for( i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==type) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int CountTrades()
{
count=0;
for( i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()<2) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+double Znomer()
{
zn=0; // z-число
psd=0; // кол. положительных сделок
usd=0; // количество отрицательных сделок
ww=0; // боол переменная
nn=0; // боол переменная
C=0; // C = количество чередований между отрицательными и положительными сделками
index=OrdersHistoryTotal();
if(OrdersHistoryTotal()>302) index=301; // берём не более 301 сделкиif(index<30) return(0); // берём не менее 30
count=OrdersHistoryTotal(); // считаем от скольки
prom=count-index; // выделяем только последние сделкиif (prom<0) prom=0; // исключаем ошибкиfor( i=count;i>prom;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)== true)
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{// далее магия
pribul=OrderProfit();
if (ww==0&&pribul>1){C++;ww=1;nn=0;}// подсчитываем смену тенденцииif (nn==0&&pribul<1){C++;ww=0;nn=1;}// подсчитываем смену тенденции if (pribul>1){psd++;}//прибыльные сделкиif (pribul<1){usd++;}// убыточные сделки
}
}
}
/*/*
Величина Z = (A * (C — 0.5) — B)/ ((B*(B — C))/(C -1))^(1/2), где:
A = количество анализируемых сделок;
B = 2*количество прибыльных сделок * количество убыточных сделок;
C = количество чередований в выборке (чередованием считается каждая пара сделок,
когда прибыльная сделка сменяет убыточную либо наоборот).
*/
index=psd+usd;
if(index<30) return(0);
zn=(index*(C-0.5)-(2*psd*usd))/
((((2*psd*usd)*((2*psd*usd)-C))/
(C-1))*((((2*psd*usd)*((2*psd*usd)-C))/
(C-1))*0.5));
return(zn);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+void Trailing()
{
bool mod;
for( i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
{
if(Bid-OrderOpenPrice()>TrailingStop*Point)
{
if((OrderStopLoss()<(Bid-TrailingStop*Point)) || (OrderStopLoss()==0))
{
mod=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Yellow);
return;
}
}
}
if(OrderType()==OP_SELL)
{
if((OrderOpenPrice()-Ask)>TrailingStop*Point)
{
if((OrderStopLoss()>(Ask+TrailingStop*Point)) || (OrderStopLoss()==0))
{
mod=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Yellow);
return;
}
}
}
}
}
}
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+void BU()
{
bool m;
for( i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
{
if(OrderOpenPrice()<=(Bid-(BULevel+BUPoint)*Point) && OrderOpenPrice()>OrderStopLoss())
{
m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BUPoint*Point,OrderTakeProfit(),0,Yellow);
}
}
if(OrderType()==OP_SELL)
{
if(OrderOpenPrice()>=(Ask+(BULevel+BUPoint)*Point) && (OrderOpenPrice()<OrderStopLoss() || OrderStopLoss()==0))
{
m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BUPoint*Point,OrderTakeProfit(),0,Yellow);
}
}
}
}
}
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+void CloseAll(int ot=-1)
{
bool cl;
for( i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==0 && (ot==0 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
}
if(OrderType()==1 && (ot==1 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
}
}
}
}
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
if(t!=Time[0]&&(Ask-Bid)<Spred*Point)
{
ww=1;
nn=1;
t=Time[0];
if(TrailingStop>0) Trailing();
if(BULevel>0) BU();
rm = iMA(NULL,TF2,MA,0,MaM,0,1)-iMA(NULL,TF2,MA,0,MaM,1,1);
pm = iMA(NULL,TF2,MA,0,MaM,0,2)-iMA(NULL,TF2,MA,0,MaM,1,2);
// Stop//---- maximums counting
hma = High[iHighest(NULL,0,MODE_HIGH,Stop,1)];
lma = Low[iLowest(NULL,0,MODE_LOW,Stop,1)];
//----//Print("hma ",hma);//Print("lma ",lma);//if ( Znomer()!=0) {zn=Znomer();Print("== Z-счёт равен = ",zn);}
}
if(ww==1 && pm<0 && rm>0 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin)) {if(Ask<hma)PutOrder(4,hma);
if(Bid>lma)PutOrder(5,lma);
ww=0;}// Если цена раньше падала а теперь растётif(nn==1 && pm>0 && rm<0 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin)) {if(Ask<hma)PutOrder(4,hma);
if(Bid>lma)PutOrder(5,lma);
nn=0;}
}
//+------------------------------------------------------------------+//+------------------------------------------------------------------+//| Tester function |//+------------------------------------------------------------------+doubleOnTester()
{
double PercentProfitTrades = 0;
if (TesterStatistics(STAT_PROFIT_TRADES) > 0)
PercentProfitTrades = TesterStatistics(STAT_PROFIT_TRADES) / TesterStatistics(STAT_TRADES) * 100;
if (PercentProfitTrades >= TesterMinPercentProfitTrades)
return(NormalizeDouble((TesterStatistics(STAT_PROFIT) / TesterStatistics(STAT_EQUITY_DD)), 2));
elsereturn(0);
}
//+------------------------------------------------------------------+
Строчка 378 - тот самый принт, включив который, советник уже не работает.
У меня есть подозрение что ошибка в оформлении кода в строчке 221 и 223 . Перебор истории никто не использует, примеров мало, поэтому возможно ошибка. Есть один пример на странице https://www.mql5.com/ru/code/7452 , но это там для меня слишком сложно. Деление на ноль в функции Znomer() строчка 206 я исключил .
Включаемый файл Z_include.mqh содержит функцию, которая вычисляет на массиве данных следующие параметры: Max - максимальное значение;Min - минимальное значение;матожидание - среднее значение;стандартное отклонение - среднеквадратичное отклонение (несмещенную оценку);скос;эксцесс;Z-счет на массиве данных. Описание понятия Z -счет смотрите в...
Строчка 378 - тот самый принт, включив который, советник уже не работает.
У меня есть подозрение что ошибка в оформлении кода в строчке 221 и 223 . Перебор истории никто не использует, примеров мало, поэтому возможно ошибка. Есть один пример на странице https://www.mql5.com/ru/code/7452 , но это там для меня слишком сложно. Деление на ноль в функции Znomer() строчка 206 я исключил .
Если не будет ни одной сделки по просматриваемому символу и маджику или же не будет ни одной прибыльной или убыточной сделки, или же будет только одна пара (C=1), то получим деление на 0.
Перед самой формулой, нужно проверить, что бы psd и usd было > 0, а C !=1
Прибыльные у вас считаются с профитом > 1, убыточные < 1, с профитом = 1 не анализируются т. е. 1 надо тоже куда-то включать в ту или иную группу.
В вашей функции сначала лучше произвести отбор номеров сделок подходящих по символу и маджику, потом проверить изменилось ли их количество, если да - пересчитываем zn, если нет то return zn (zn в этом случае не обнулять и проверка != 0 при принте не потребуется)
Сова перестаёт работать потому, что опирается на переменные ww и nn, а входе работы вашей функции они меняются и рушат алгоритм совы.
При ошибке оформления кода ничего бы не компилировалось.
Тогда еще один вопрос :-)
До перемещения метки с ценой горизонтальное положение вычисляется через текущую ширину экрана
x=width -70;Когда я открываю боковую панель, то метка уезжает вправо за границу экрана. Если нажать на кнопку обновить в журнале видно работу индикатора, но метка не возвращается, она появляется только со второй попытки. Получается что OnCalculate вызывается не каждый раз? Как сделать работу функции постоянной?
Тогда еще один вопрос :-)
До перемещения метки с ценой горизонтальное положение вычисляется через текущую ширину экрана
Когда я открываю боковую панель, то метка уезжает вправо за границу экрана. Если нажать на кнопку обновить в журнале видно работу индикатора, но метка не возвращается, она появляется только со второй попытки. Получается что OnCalculate вызывается не каждый раз? Как сделать работу функции постоянной?
делать опрос и перерисовку в OnChartEvent - CHARTEVENT_CHART_CHANGE
Приветствую. Подскажите, пожалста.
Если индикатор отрисовывает стрелки на графике, и стрелки не являются объектами, то можно ли получить параметры такой отрисовки с самого графика или другим способом? Получить данные из буферов и даже нормально запустить индикатор для тестирования не удается
Приветствую. Подскажите, пожалста.
Если индикатор отрисовывает стрелки на графике, и стрелки не являются объектами, то можно ли получить параметры такой отрисовки с самого графика или другим способом? Получить данные из буферов и даже нормально запустить индикатор для тестирования не удается
А код индикатора есть?
А код индикатора есть?
нет
Вот здесь обсуждали попытки получить с него данные, и сам индикатор
https://www.mql5.com/ru/forum/160587/page165#comment_10221621
Изучаю примеры из учебника, один из них не компилируется на строке
'MQL5_PROGRAM_NAME' - cannot convert enum mouse_2.mq5 29 52
Разрешение на работу для советника проверь. И где в принт вывод? Этот кусок кода по-лбому что-то возвращает, раз ошибок нет, значит проблема за пределами этого куска кода. В этом куске разве, что деление на 0 может возникать
Код целиком ? Да, сейчас .
Строчка 378 - тот самый принт, включив который, советник уже не работает.
У меня есть подозрение что ошибка в оформлении кода в строчке 221 и 223 . Перебор истории никто не использует, примеров мало, поэтому возможно ошибка. Есть один пример на странице https://www.mql5.com/ru/code/7452 , но это там для меня слишком сложно.
Деление на ноль в функции Znomer() строчка 206 я исключил .
Жду инструкций и рекомендаций. Спасибо.
нет
Вот здесь обсуждали попытки получить с него данные, и сам индикатор
https://www.mql5.com/ru/forum/160587/page165#comment_10221621
Извиняйте, я принципиально не запускаю .dll на своём компе, дальше без меня.
Здесь только индикаторы. При использовании в параметрах отключал использование второго.
Код целиком ? Да, сейчас .
Строчка 378 - тот самый принт, включив который, советник уже не работает.
У меня есть подозрение что ошибка в оформлении кода в строчке 221 и 223 . Перебор истории никто не использует, примеров мало, поэтому возможно ошибка. Есть один пример на странице https://www.mql5.com/ru/code/7452 , но это там для меня слишком сложно.
Деление на ноль в функции Znomer() строчка 206 я исключил .
Жду инструкций и рекомендаций. Спасибо.
Лишнее ((2*psd*usd)*((2*psd*usd)-C))/(C-1)) в формуле.
Возведение в степень: ^0.5 это не *0.5
Если не будет ни одной сделки по просматриваемому символу и маджику или же не будет ни одной прибыльной или убыточной сделки, или же будет только одна пара (C=1), то получим деление на 0.
Перед самой формулой, нужно проверить, что бы psd и usd было > 0, а C !=1
Прибыльные у вас считаются с профитом > 1, убыточные < 1, с профитом = 1 не анализируются т. е. 1 надо тоже куда-то включать в ту или иную группу.
В вашей функции сначала лучше произвести отбор номеров сделок подходящих по символу и маджику, потом проверить изменилось ли их количество, если да - пересчитываем zn, если нет то return zn (zn в этом случае не обнулять и проверка != 0 при принте не потребуется)
Сова перестаёт работать потому, что опирается на переменные ww и nn, а входе работы вашей функции они меняются и рушат алгоритм совы.
При ошибке оформления кода ничего бы не компилировалось.