Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 100

 

Ciao a tutti, potete per favore aiutarmi a trovare un errore nel codice dell'EA, penso di aver controllato tutto, sembra essere tutto scritto correttamente nel codice, ma il programma non fa trading correttamente per qualche motivo! L'idea è questa: il consulente deve cercare due candele lunghe della stessa direzione (la lunghezza tra le candele è regolabile nel consulente, cioè tra le due candele minime o massime, a seconda della direzione), se il prezzo nella direzione opposta rompe il minimo o il massimo dell'ultima candela, si dovrebbe aprire un'operazione (esempio situazioni immagine sul grafico allegato al file). Il consulente dovrebbe aprire accordi in ogni situazione adatta, ma per qualche motivo apre accordi solo nelle finestre di trading tra i giorni. Ecco la situazione, che non è difficile da programmatori, si prega di aiutare, risolvere l'errore. Codice EA vedi sotto, così come nel file allegato.


//+-----------------------------------------------------------------------------------------------+

//| Spaziatura_Candele.mq4 |

//| Copyright 2017, Vladim |

//| vk.com/id229534564 |

//| Posta: Vladim120385@yandex.ru |

//+-----------------------------------------------------------------------------------------------+

#proprietà copyright "Copyright 2017, Vladim"

#proprietà link "vk.com/id229534564"

#proprietà versione "1.00"

#proprietà rigorosa


//--- parametri EA

extern string paramEA = ""; // Parametri EA

extern double volume = 0.01; // Volume

extern double stopLoss = 5; // StopLoss.

extern double takeProfit = 1.5; // TakeProfit

extern double maxSpacing = 150; // MaxSpacing

extern double minSpacing = 30; // MinSpacing

extern double TrailingStop = 0; // TrailingStop

extern int magic = 127; // Magic


//--- variabili globali

datetime newCandle;

int punta;


//+-----------------------------------------------------------------------------------------------+

int OnInit()

{

return(INIT_SUCCEED);

}

//+-----------------------------------------------------------------------------------------------+

void OnDeinit(const int reason)

{

}

//+-----------------------------------------------------------------------------------------------+

void OnTick()

{

if(newCandle != Time[0]) FindPattern();

newCandle = Time[0];

}

//+-----------------------------------------------------------------------------------------------+

void OpenOrder(int type) // Aprire un ordine a mercato

{

if(type == OP_BUY) if(OrderSend(_Symbol, OP_BUY, volume, Ask, 0, 0, 0, "", magic, 0)) ImpostaSLTP(OP_BUY);

if(type == OP_SELL) if(OrderSend(_Symbol, OP_SELL, volume, Bid, 0, 0, 0, 0, "", magic, 0)) ImpostaSLTP(OP_SELL);

}

//+-----------------------------------------------------------------------------------------------+

void SetSLTP(int type) //impostare ordini stop

{

doppio sl = 0;

doppio tp = 0;

se(tipo == OP_BUY)

for(int i = 0; i < OrdersTotal(); i++)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_BUY && OrderStopLoss() == 0)

{

sl = NormalizeDouble(Low[1] - stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() + (OrderOpenPrice() - Low[1]) * takeProfit, Digits);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) return;

}

se(tipo == OP_SELL)

for(int i = 0; i < OrdersTotal(); i++)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_SELL && OrderStopLoss() == 0)

{

sl = NormalizeDouble(High[1] + stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() - (High[1] - OrderOpenPrice()) * takeProfit, Digits);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) return;

}

}

//+-----------------------------------------------------------------------------------------------+

void FindPattern() // Cercare una lunga distanza tra le candele

{

if(Alto[1] < Alto[2] && Offerta > Alto[1] && Basso[1] < Basso[2])

{

double spacing = NormalizeDouble((High[2] - High[1]) / _Point, 0);

if(maxSpacing >= spaziatura && minSpacing <= spaziatura)

OpenOrder(OP_BUY);

}

if(Low[1] > Low[2] && Bid < Low[1] && High[1] > High[2])

{

double spacing = NormalizeDouble((Low[1] - Low[2]) / _Point, 0);

if(maxSpacing >= spaziatura && minSpacing <= spaziatura)

OpenOrder(OP_SELL);

}

{

if(TrailingStop!=0) TrailingStop();

}

}

//+-----------------------------------------------------------------------------------------------+

void TrailingStop()

{

doppio StLo,OSL,OOP;

bool error=true;

per (int i=0; i<OrdersTotal(); i++)

{

se (OrderSelect(i, SELECT_BY_POS))

{

tip = OrderType();

if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magico)

{

OSL = NormalizeDouble(OrderStopLoss(),Digits);

OOP = NormalizeDouble(OrderOpenPrice(),Digits);

se (punta==0)

{

StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits);

se (StLo < OOP) continua;

se (StLo > OSL)

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);


}

se (punta==1)

{

StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);

se (StLo > OOP) continua;

se (StLo < OSL || OSL==0 )

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);

}

if (!error) Alert("Error TrailingStop ",GetLastError()," ",Symbol()," SL ",StLo);

}

}

}

}

//+-----------------------------------------------------------------------------------------------+

File:
 
Vladim1203:

Ciao a tutti, potete per favore aiutarmi a trovare un errore nel codice dell'EA, penso di aver controllato tutto, sembra essere tutto scritto correttamente nel codice, ma il programma non fa trading correttamente per qualche motivo! L'idea è questa: il consulente deve cercare due candele lunghe della stessa direzione (la lunghezza tra le candele è regolabile nel consulente, cioè tra le due candele minime o massime, a seconda della direzione), se il prezzo nella direzione opposta rompe il minimo o il massimo dell'ultima candela, si dovrebbe aprire un'operazione (esempio situazioni immagine sul grafico allegato al file). Il consulente dovrebbe aprire accordi in ogni situazione adatta, ma per qualche motivo apre accordi solo nelle finestre di trading tra i giorni. Ecco la situazione, che non è difficile da programmatori, si prega di aiutare, risolvere l'errore. Il codice EA guarda qui sotto e anche nel file allegato.

Forse già abbastanza, hai accumulato post in ogni thread, e allo stesso tempo hai creato il tuo.

 
kuzhakov:

Ciao.
Puoi dirmi come limitare il trading EA in base al tempo.
Ho provato molti metodi del forum, ma niente ha funzionato, non capisco niente di scrittura.
Sarebbe bello se si potesse puntare il dito su cosa mettere.


Inserirlo dopo l'avvio. e l'eXpert scambierà ogni giorno ad un dato intervallo di tempo sul terminale


int val=Hour();
 double min=Minute();
 double Dl = val + min/100;  
 double L = xxxx+xxxx/100; //час + минуты вместо хххх - это начало времени
 double P = xxxx+xxxx/100; //час + минуты вместо хххх - это конец времени
 if(Dl<L)return;
 if(Dl>P)return;
 
Vladim1203:

Ciao a tutti, potete per favore aiutarmi a trovare un errore nel codice dell'EA, penso di aver controllato tutto, sembra essere tutto scritto correttamente nel codice, ma il programma non fa trading correttamente per qualche motivo! L'idea è questa: il consulente deve cercare due candele lunghe della stessa direzione (la lunghezza tra le candele è regolabile nel consulente, cioè tra le due candele minime o massime, a seconda della direzione), se il prezzo nella direzione opposta rompe il minimo o il massimo dell'ultima candela, si dovrebbe aprire un'operazione (esempio situazioni immagine sul grafico allegato al file). Il consulente dovrebbe aprire accordi in ogni situazione adatta, ma per qualche motivo apre accordi solo nelle finestre di trading tra i giorni. Ecco la situazione, che non è difficile da programmatori, si prega di aiutare, risolvere l'errore. Vedi il codice EA qui sotto e anche nel file allegato.


controllare le condizioni per l'entrata in acquisto e in vendita

 
Vladim1203:

Ciao a tutti, potete per favore aiutarmi a trovare un errore nel codice dell'EA, penso di aver controllato tutto, sembra essere tutto scritto correttamente nel codice, ma il programma non fa trading correttamente per qualche motivo! L'idea è questa: il consulente deve cercare due candele lunghe della stessa direzione (la lunghezza tra le candele è regolabile nel consulente, cioè tra le due candele minime o massime, a seconda della direzione), se il prezzo nella direzione opposta rompe il minimo o il massimo dell'ultima candela, si dovrebbe aprire un'operazione (esempio situazioni immagine sul grafico allegato al file). Il consulente dovrebbe aprire accordi in ogni situazione adatta, ma per qualche motivo apre accordi solo nelle finestre di trading tra i giorni. Ecco la situazione, che non è difficile da programmatori, si prega di aiutare, risolvere l'errore. Vedi il codice EA qui sotto e nel file allegato.

È meglio scrivere prima la parte dell'EA che segnerebbe sul grafico le candele trovate, in modo che tutto diventi chiaro. E le linee seguenti non sono necessarie nel vostro caso:

extern string paramEA    = "";     // Parameters EA

и

//+-----------------------------------------------------------------------------------------------+
int OnInit()
{
   
   return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   
}
//+-----------------------------------------------------------------------------------------------+
 

Per favore aiutate la comunità ...
*
Ho scaricato l'indicatore Kalman Filter dal forum (codice sorgente allegato).
Tutto è a posto sul grafico.


Quando provo a leggerlo in Expert Advisor la seguente linea



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

Emette lo stesso grande numero, ovviamente non correlato all'indicatore:

Cosa può essere?

File:
 
MikeZv:

L'aiuto della comunità ...
*
Ho scaricato l'indicatore Kalman Filter dal forum (codice sorgente allegato).
Tutto è a posto sul grafico.


Quando provo a leggerlo in Expert Advisor la seguente linea



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

Emette lo stesso grande numero, ovviamente non correlato all'indicatore:

Cosa può essere?

VUOTO_VALORE

Valore vuoto nel buffer dell'indicatore

2147483647 (0x7FFFFFFFF)

 
Alekseu Fedotov:

VUOTO_VALORE

Valore vuoto nel buffer dell'indicatore

2147483647 (0x7FFFFFFFF)


:) L'ho già trovato ...
Perché viene fuori?

 
MikeZv:

:) L'ho già trovato ...
Ma perché viene fuori?


L'indicatore ha 2 matrici perché ci sono 2 colori. Mentre c'è una linea del primo colore sulla barra, la matrice con il secondo colore è uguale a EMPTY_VALUE,

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1);

iValue = EMPTY_VALUE, allora la linea su 1 barra è arancione. (perché array blue = EMPTY_VALUE)

 
Nikolay Ivanov:

L'indicatore ha 2 matrici perché ci sono 2 colori. Mentre c'è una linea del primo colore sulla barra, la matrice con il secondo colore è uguale a EMPTY_VALUE,

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1);

iValue = EMPTY_VALUE, allora la linea su 1 barra è arancione. (Perché array blu = VUOTO_VALORE)


Grazie, Nikolai...
Ho preso da entrambe le linee.
Poi li ho fusi in uno solo (un buffer a sinistra). Stesso risultato.
*
Ho una domanda del genere:
L'indicatore ha la variabile draw_begin=500, cioè il numero di candele dalla fine (dalla candela più fresca) dove viene disegnato il grafico.
E quando estraiamo il valore dell'indicatore usando il metodo iCustom(), questi 500 punti sono contati da quale candela?
Perché è importante - draw_begin è usato non solo per il disegno, ma partecipa anche al calcolo dell'indicatore ...