Prima di spostare l'indicatore di prezzo, la posizione orizzontale è calcolata attraverso la larghezza attuale dello schermo
x=width -70;
Quando apro la barra laterale, il marcatore si sposta a destra oltre il confine dello schermo. Se premo il pulsante di aggiornamento nel registro posso vedere che l'indicatore funziona, ma l'indicatore non ritorna, appare solo al secondo tentativo. Risulta che OnCalculate non viene chiamato ogni volta? Come far funzionare la funzione in modo permanente?
Prima di spostare l'indicatore di prezzo, la posizione orizzontale è calcolata attraverso la larghezza attuale dello schermo
Quando apro la barra laterale, il marcatore si sposta a destra oltre il confine dello schermo. Se premo il pulsante di aggiornamento nel registro posso vedere che l'indicatore funziona, ma l'indicatore non ritorna, appare solo al secondo tentativo. Risulta che OnCalculate non viene chiamato ogni volta? Come fare in modo che questa funzione funzioni sempre?
fare il polling e ridisegnare inOnChartEvent - CHARTEVENT_CHART_CHANGE
Se l'indicatore disegna frecce sul grafico e le frecce non sono oggetti, è possibile ottenere i parametri di tale disegno dal grafico stesso o in qualche altro modo? Non posso ottenere i dati dai buffer e nemmeno eseguire l'indicatore per i test normalmente
Se l'indicatore disegna frecce sul grafico e le frecce non sono oggetti, è possibile ottenere i parametri di tale disegno dal grafico stesso o in qualche altro modo? Non posso ottenere i dati dai buffer e nemmeno eseguire l'indicatore per i test normalmente
Verificare il permesso di lavoro per un consulente. E dov'è l'output nella stampa? Questo pezzo di codice sembra restituire qualcosa, poiché non ci sono errori, quindi il problema è al di fuori di questo pezzo di codice. In questo pezzo, tranne per il fatto che può verificarsi una divisione per 0
Codice intero? Si Adesso .
//+------------------------------------------------------------------+//| 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 );
}
//+------------------------------------------------------------------+
La riga 378 è la stessa stampa, quando abilitata, l'EA non funziona più.
Ho il sospetto che ci sia un errore nella progettazione del codice nelle righe 221 e 223 . Nessuno usa l'enumerazione della cronologia, ci sono pochi esempi, quindi è possibile un errore. C'è un esempio nella pagina https://www.mql5.com/en/code/7452 , ma è troppo complicato per me lì. Divisione per zero nella funzione Znomer(), riga 206, ho escluso.
Включаемый файл Z_include.mqh содержит функцию, которая вычисляет на массиве данных следующие параметры: Max - максимальное значение;Min - минимальное значение;матожидание - среднее значение;стандартное отклонение - среднеквадратичное отклонение (несмещенную оценку);скос;эксцесс;Z-счет на массиве данных. Описание понятия Z -счет смотрите в...
La linea 378 è la stessa stampa che, una volta abilitata, fa sì che l'EA non funzioni più.
Ho il sospetto che ci sia un errore nella formattazione del codice alle linee 221 e 223 . Nessuno usa la riproduzione della storia, non ci sono molti esempi, quindi questo potrebbe essere un errore. C'è un esempio su https://www.mql5.com/ru/code/7452 , ma è troppo complicato per me. Ho escluso ladivisione per zero nella funzione Znomer(), linea 206.
Sto aspettando istruzioni e raccomandazioni. Grazie.
Se non c'è un solo commercio sul simbolo guardato attraverso e majik, o non c'è un solo profitto o perdita, o c'è solo una coppia (C=1), otterremo la divisione per 0.
Prima della formula stessa, dovreste controllare che psd e usd siano > 0, e C !=1
Le coppie redditizie sono calcolate con profitto > 1, perdita < 1, con profitto=1 non sono analizzate, cioè anche 1 deve essere incluso da qualche parte in questo o quel gruppo.
Nella tua funzione, sarebbe meglio selezionare prima i numeri di transazione che corrispondono al simbolo e al numero magico e poi controllare se il loro numero è cambiato, se sì - ricalcolare zn, se no - restituire zn (zn in questo caso non si azzera e il controllo != 0 non sarà necessario quando si stampa)
Il gufo smette di funzionare, perché si basa sulle variabili ww e nn, e quando la tua funzione funziona, queste cambiano e rompono l'algoritmo del gufo.
Niente sarebbe stato compilato se ci fosse stato un errore di progettazione del codice.
Un'altra domanda allora :-)
Prima di spostare l'indicatore di prezzo, la posizione orizzontale è calcolata attraverso la larghezza attuale dello schermo
x=width -70;Quando apro la barra laterale, il marcatore si sposta a destra oltre il confine dello schermo. Se premo il pulsante di aggiornamento nel registro posso vedere che l'indicatore funziona, ma l'indicatore non ritorna, appare solo al secondo tentativo. Risulta che OnCalculate non viene chiamato ogni volta? Come far funzionare la funzione in modo permanente?
Un'altra domanda allora :-)
Prima di spostare l'indicatore di prezzo, la posizione orizzontale è calcolata attraverso la larghezza attuale dello schermo
Quando apro la barra laterale, il marcatore si sposta a destra oltre il confine dello schermo. Se premo il pulsante di aggiornamento nel registro posso vedere che l'indicatore funziona, ma l'indicatore non ritorna, appare solo al secondo tentativo. Risulta che OnCalculate non viene chiamato ogni volta? Come fare in modo che questa funzione funzioni sempre?
fare il polling e ridisegnare inOnChartEvent - CHARTEVENT_CHART_CHANGE
Saluti. Può dirmi qualcosa?
Se l'indicatore disegna frecce sul grafico e le frecce non sono oggetti, è possibile ottenere i parametri di tale disegno dal grafico stesso o in qualche altro modo? Non posso ottenere i dati dai buffer e nemmeno eseguire l'indicatore per i test normalmente
Saluti. Può dirmi qualcosa?
Se l'indicatore disegna frecce sul grafico e le frecce non sono oggetti, è possibile ottenere i parametri di tale disegno dal grafico stesso o in qualche altro modo? Non posso ottenere i dati dai buffer e nemmeno eseguire l'indicatore per i test normalmente
Avete il codice dell'indicatore?
C'è un codice per l'indicatore?
no
I tentativi di ottenere dati da esso, e l'indicatore stesso, sono stati discussi qui
https://www.mql5.com/ru/forum/160587/page165#comment_10221621
Sto studiando gli esempi nel tutorial e uno di essi non riesce a compilare sulla linea
'MQL5_PROGRAM_NAME' - non può convertire enum mouse_2.mq5 29 52
Verificare il permesso di lavoro per un consulente. E dov'è l'output nella stampa? Questo pezzo di codice sembra restituire qualcosa, poiché non ci sono errori, quindi il problema è al di fuori di questo pezzo di codice. In questo pezzo, tranne per il fatto che può verificarsi una divisione per 0
Codice intero? Si Adesso .
La riga 378 è la stessa stampa, quando abilitata, l'EA non funziona più.
Ho il sospetto che ci sia un errore nella progettazione del codice nelle righe 221 e 223 . Nessuno usa l'enumerazione della cronologia, ci sono pochi esempi, quindi è possibile un errore. C'è un esempio nella pagina https://www.mql5.com/en/code/7452 , ma è troppo complicato per me lì.
Divisione per zero nella funzione Znomer(), riga 206, ho escluso.
Attendo istruzioni e consigli. Grazie.
no
I tentativi di ottenere dati da esso, e l'indicatore stesso, sono stati discussi qui
https://www.mql5.com/ru/forum/160587/page165#comment_10221621
Mi dispiace, non eseguo la .dll sul mio computer per una questione di principio, andate avanti senza di me.
Solo gli indicatori qui. Quando si usa nei parametri ho disabilitato l'uso del secondo.
L'intero codice? Sì, ora.
La linea 378 è la stessa stampa che, una volta abilitata, fa sì che l'EA non funzioni più.
Ho il sospetto che ci sia un errore nella formattazione del codice alle linee 221 e 223 . Nessuno usa la riproduzione della storia, non ci sono molti esempi, quindi questo potrebbe essere un errore. C'è un esempio su https://www.mql5.com/ru/code/7452 , ma è troppo complicato per me.
Ho escluso ladivisione per zero nella funzione Znomer(), linea 206.
Sto aspettando istruzioni e raccomandazioni. Grazie.
L'eccesso((2*psd*usd)*((2*psd*usd)-C))/(C-1)) nella formula.
Al grado: ^0.5 non è *0.5
Se non c'è un solo commercio sul simbolo guardato attraverso e majik, o non c'è un solo profitto o perdita, o c'è solo una coppia (C=1), otterremo la divisione per 0.
Prima della formula stessa, dovreste controllare che psd e usd siano > 0, e C !=1
Le coppie redditizie sono calcolate con profitto > 1, perdita < 1, con profitto=1 non sono analizzate, cioè anche 1 deve essere incluso da qualche parte in questo o quel gruppo.
Nella tua funzione, sarebbe meglio selezionare prima i numeri di transazione che corrispondono al simbolo e al numero magico e poi controllare se il loro numero è cambiato, se sì - ricalcolare zn, se no - restituire zn (zn in questo caso non si azzera e il controllo != 0 non sarà necessario quando si stampa)
Il gufo smette di funzionare, perché si basa sulle variabili ww e nn, e quando la tua funzione funziona, queste cambiano e rompono l'algoritmo del gufo.
Niente sarebbe stato compilato se ci fosse stato un errore di progettazione del codice.