Per quanto ho capito, è responsabile del fatto che l'EA ritardi il ricalcolo fino alla comparsa di una nuova barra. Finché il tempo di apertura della barra zero non cambia, il ricalcolo si ferma.
Di conseguenza, se apro un EA su minuti, sarà ricalcolato ad ogni nuovo minuto. E se lo apro su H4, sarà ricalcolato ogni 4 ore.
Come scrivere correttamente questa linea, in modo che l'EA non prenda il tempo di apertura della barra corrente, cioè, la barra in cui il terminale è aperto, ma quella che specificherò nelle impostazioni? Cioè, metto l'EA su H4, per esempio, e ricalcolerà ogni 5 minuti, perché l'ho impostato così. O ogni minuto.
1) Qualsiasi strategia deve essere definita dal numero di ordini aperti allo stesso tempo. Di conseguenza, prima di aprire il prossimo ordine, dovremmo controllare quanti sono già aperti.
2) Su una barra, non ci possono essere frattali SUPERIORI e INFERIORI allo stesso tempo, rispettivamente, il controllo è classificato come
appartiene alla categoria dell'idiozia del programmatore.
3) Prima di scrivere le condizioni per restituire i valori dell'indicatore del buffer, è necessario sapere esattamente quale valore è "vuoto" per esso? Avete controllato che sia 0?
4) Il costrutto.
Anche se funzionerà (nella maggior parte dei casi), ma è innaturale, perché è un'idea del "libero arbitrio" dello sviluppatore, ed è disinformativa per il commerciante. Un'alternativa - il tracciamento di una nuova barra.
5) Bisogna partire dalle basi, perché questo:
Indica che non capisci affatto quello che stai scrivendo.
Il modo migliore per capire è studiare come funzionano i codici degli altri e modificarli per i propri scopi. Buona fortuna.
Li mostra come sono scritti, punto per punto. Non li modifica, cosa di cui non hai detto una parola. Ecco il codice completo:
//+------------------------------------------------------------------+//| Strategy 3.mq4 |//| |//| |//+------------------------------------------------------------------+#property copyright""#property link""#include <Library1.mqh>
externint Magic=111;
externint TP=20;
externint SL=30;
externint Trall_dist=10;
externint Shag=10;
externbool Isp_shag=false;
externbool Isp_bezubitok=false;
externdouble Lot=0.1;
double SS=0,BS=0;
//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init()
{
//----//----return(0);
}
//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit()
{
//----//----return(0);
}
//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start()
{
double tp,sl;
if(Digits==3||Digits==5) {tp=TP*10*Point;sl=SL*10*Point;} // условие для пятизнака
elseif(Digits==2||Digits==4) {tp=TP*Point;sl=SL*Point;} // условие для четырехзнака
double Up=iFractals(Symbol(),0,MODE_UPPER,3); //верхний фрактал,формируется на третьей свече
double Down=iFractals(Symbol(),0,MODE_LOWER,3); //нижний фрактал,формируется на третьей свече
//----if(Up>0&&Down==0&&Volume[0]<2) //если верхний фрактал есть а нижнего нету и прошло не больше 2х тиков то:
{
if((High[3]+5*Point-Ask)/Point>MarketInfo(Symbol(),MODE_STOPLEVEL)) //если расстояние 0 бара от хая фрактала позволяет то:
OrderSend(Symbol(),OP_BUYSTOP,Lot,High[3]+5*Point,20,High[3]-sl,High[3]+tp,NULL,Magic,0,Green);//выставляем отложенный на покупку
else {BS=High[3]+5*Point; Print("Виртуальный BS:",BS);} // а ели нет то запоминаем(позже будет добавлен вход с рынка)
{
for (int pos=0;pos==OrdersTotal();pos++)
OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
if(OrderMagicNumber()==Magic&&OrderSymbol()==Symbol()&&OrderType()==OP_BUYSTOP)
{
OrderModify(OrderTicket(),Up+5*Point,High[3]-sl,High[3]+tp,0,CLR_NONE);
}
}
}
elseif(Up==0&&Down>0&&Volume[0]<2)
{
if((Bid-Low[3]-5*Point)/Point>MarketInfo(Symbol(),MODE_STOPLEVEL))
OrderSend(Symbol(),OP_SELLSTOP,Lot,Low[3]-5*Point,20,Low[3]+sl,Low[3]-tp,NULL,Magic,0,Red);
else {SS=Low[3]-5*Point; Print("Виртуальный SS:",SS);}
{
for (pos=1;pos==OrdersTotal();pos++)
{
OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
if(OrderMagicNumber()==Magic&&OrderSymbol()==Symbol()&&OrderType()==OP_SELLSTOP)
{
OrderModify(OrderTicket(),Down-5*Point,Low[3]+sl,Low[3]-tp,0,CLR_NONE);
}
}
}
if(OrdersTotal()>0)
Trailing_stop(Magic,Symbol(),Trall_dist,Shag,Isp_shag,Isp_bezubitok);
return(0);
}}
//+------------------------------------------------------------------+
Sto cercando di scrivere come ho letto, guardato, capito. La tua critica mi ricorda un manuale MQL4 - lo capisco solo se qualcuno me lo spiega.
if(Up>0&&Down==0&&Volume[0]<2) //если верхний фрактал есть а нижнего нету и прошло не больше 2х тиков то:
{
if((High[3]+5*Point-Ask)/Point>MarketInfo(Symbol(),MODE_STOPLEVEL)) //если расстояние 0 бара от хая фрактала позволяет то:OrderSend(Symbol(),OP_BUYSTOP,Lot,High[3]+5*Point,20,High[3]-sl,High[3]+tp,NULL,Magic,0,Green);//выставляем отложенный на покупкуelse {BS=High[3]+5*Point; Print("Виртуальный BS:",BS);} // а ели нет то запоминаем(позже будет добавлен вход с рынка){ // К чему относится эта скобка???
for (int pos=0;pos==OrdersTotal();pos++)
OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
if(OrderMagicNumber()==Magic&&OrderSymbol()==Symbol()&&OrderType()==OP_BUYSTOP)
{
OrderModify(OrderTicket(),Up+5*Point,High[3]-sl,High[3]+tp,0,CLR_NONE);
}
} // это пара к той...
}
E questo codice
if(Digits==3||Digits==5) {tp=TP*10*Point;sl=SL*10*Point;} // условие для пятизнакаelseif(Digits==2||Digits==4) {tp=TP*Point;sl=SL*Point;} // условие для четырехзнака
è meglio scrivere in init() e meglio non così
double point; // на уровне глобальных переменныхintOnInit()
{
point = Digits%2 == 0 ? _Point : _Point * 10;
}
2) Non ci possono essere frattali UPPER e LOWER sulla stessa barra allo stesso tempo, rispettivamente, controllare
appartiene alla categoria dell'idiozia del programmatore.
Quindi queste citazioni sono solo per gli idioti.
2) Non ci possono essere frattali UPPER e LOWER sulla stessa barra allo stesso tempo, rispettivamente, controllare
appartiene alla categoria dell'idiozia dei programmatori.
Entrambi i frattali possono essere sulla stessa barra
intendeva minuti, ma ha dimenticato i mesi
Qual è la differenza tra minuti e mesi?
Di cosa si lamenta nel registro delle modifiche? "Stupidamente apre nuovi ordini in sospeso" perché non c'è un limite, ma c'è un OrderSend.
Qual è la differenza tra minuti e mesi?
1) Qualsiasi strategia deve essere definita dal numero di ordini aperti allo stesso tempo. Di conseguenza, prima di aprire il prossimo ordine, dovremmo controllare quanti sono già aperti.
2) Su una barra, non ci possono essere frattali SUPERIORI e INFERIORI allo stesso tempo, rispettivamente, il controllo è classificato come
appartiene alla categoria dell'idiozia del programmatore.
3) Prima di scrivere le condizioni per restituire i valori dell'indicatore del buffer, è necessario sapere esattamente quale valore è "vuoto" per esso? Avete controllato che sia 0?
4) Il costrutto.
Anche se funzionerà (nella maggior parte dei casi), ma è innaturale, perché è un'idea del "libero arbitrio" dello sviluppatore, ed è disinformativa per il commerciante. Un'alternativa - il tracciamento di una nuova barra.
5) Bisogna partire dalle basi, perché questo:
Indica che non capisci affatto quello che stai scrivendo.
Il modo migliore per capire è studiare come funzionano i codici degli altri e modificarli per i propri scopi. Buona fortuna.
E questo codice
è meglio scrivere in init() e meglio non così
e poi in start()
tp = High[3]+TP*point;