[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non potrei andare da nessuna parte senza di te - 2. - pagina 465

 
extralifes:

Aiutami a capire il codice. Non so come descrivere correttamente la condizione.

Ecco un pezzo dell'EA.

if(total<1)

{

while (d_mn_1>d_pl_1 && (d_mn_0-d_pl_0)>=2) //Пока это условие выполняется открывать только селл при таком условии (iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)>0.7)&&(iRSI(NULL,0,rsi_period,PRICE_CLOSE,0)<0.7)) -какой оператор использовать и как его оформить?
{
OrderSend(Symbol(), OP_SELL, lots, NormalizeDouble(Bid, Digits), 3, /*Ask+10*Point*/0, /*Bid-10*Point*/0, "ADX sell", magic, 0, CLR_NONE);
}

while (d_pl_1>d_mn_1 && (d_pl_0-d_mn_0)>=2) // Пока это условие выполняется открывать только Бай при таком условии (iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)<0.3)&&(iRSI(NULL,0,rsi_period,PRICE_CLOSE,0)>0.3)) - какой оператор использовать и как его оформить?
{
OrderSend(Symbol(), OP_BUY, lots, NormalizeDouble(Ask, Digits), 3, /*Bid-10*Point*/0, /*Ask+10*Point*/0, "ADX buy", magic, 0, CLR_NONE);

}
}
}
}
Qualche tipo di orto ....
 
butthead:

Capisco che il fattore psicologico me lo impedisce... l'avidità... la paura di perdere anche 300 p... Cosa devo fare? Dimenticate che il vero conto...


E se cambiassi la mia mentalità? Non "puntare a vincere", ma "puntare a non perdere".
 

Aiuta a capire!

L'essenza dell'idea: mentre l'iMACD sta aumentando - manteniamo l'ACQUISTO, non appena inizia a diminuire - chiudiamo l'ACQUISTO e apriamo la VENDITA. Il confronto viene fatto utilizzando gli ultimi tre valori, escluso quello attuale.

Il codice ha un problema: apre ordini multipli a valori iMACD +-0, come vedo. Normalizedouble() non aiuta.

Ecco il codice:

int start()
  {

double MA1=iMACD(NULL,0,5,34,1,PRICE_CLOSE, MODE_MAIN,1), 
       MA2=iMACD(NULL,0,5,34,1,PRICE_CLOSE, MODE_MAIN,2),
       MA3=iMACD(NULL,0,5,34,1,PRICE_CLOSE, MODE_MAIN,3);
       
       
       
if (MA1>MA2>MA3 && Napr==1)
    {Closeall();
    Napr=0;
    OrderSend (Symbol(), OP_BUY, Lot, Ask, 5, 0,0);}

if (MA1<MA2<MA3 && Napr==0)
    {Closeall();
    Napr=1;
    OrderSend (Symbol(), OP_SELL, Lot, Bid, 5, 0,0);}



   return(0);
  }
 
extralifes:

Aiutami a capire il codice. Non so come descrivere correttamente la condizione.

Ecco un pezzo dell'Expert Advisor.


total=OrdersTotal();

if(total<1)

{

while (d_mn_1>d_pl_1 && (d_mn_0-d_pl_0)>=2) //Пока это условие выполняется открывать только селл при таком условии (iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)>0.7)&&(iRSI(NULL,0,rsi_period,PRICE_CLOSE,0)<0.7)) -какой оператор использовать и как его оформить?
{
OrderSend(Symbol(), OP_SELL, lots, NormalizeDouble(Bid, Digits), 3, /*Ask+10*Point*/0, /*Bid-10*Point*/0, "ADX sell", magic, 0, CLR_NONE);
}

while (d_pl_1>d_mn_1 && (d_pl_0-d_mn_0)>=2) // Пока это условие выполняется открывать только Бай при таком условии (iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)<0.3)&&(iRSI(NULL,0,rsi_period,PRICE_CLOSE,0)>0.3)) - какой оператор использовать и как его оформить?
{
OrderSend(Symbol(), OP_BUY, lots, NormalizeDouble(Ask, Digits), 3, /*Bid-10*Point*/0, /*Ask+10*Point*/0, "ADX buy", magic, 0, CLR_NONE);

}
}
}
}
Puoi dirmi come farlo correttamente?


Non funziona così?

total=OrdersTotal();
if(total<1)

{

  if (d_mn_1>d_pl_1 && (d_mn_0-d_pl_0)>=2 && iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)>0.7 &&  iRSI(NULL,0,rsi_period,PRICE_CLOSE,0<0.7)
        OrderSend(Symbol(), OP_SELL, lots, NormalizeDouble(Bid, Digits), 3, /*Ask+10*Point*/0, /*Bid-10*Point*/0, "ADX sell", magic, 0, CLR_NONE);
   

  if (d_pl_1>d_mn_1 && (d_pl_0-d_mn_0)>=2 && iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)<0.3 && iRSI(NULL,0,rsi_period,PRICE_CLOSE,0) > 0.3) 
       OrderSend(Symbol(), OP_BUY, lots, NormalizeDouble(Ask, Digits), 3, /*Bid-10*Point*/0, /*Ask+10*Point*/0, "ADX buy", magic, 0, CLR_NONE);

  }
 

no attraverso se non funziona.

Dovrebbe essere, purché la condizione (d_mn_1>d_pl_1 && (d_mn_0-d_pl_0)>=2 sia corretta, di aprire solo un ordine di vendita se iRSI(NULL,0,rsi_periodo,PRICE_CLOSE,2)>0.7 && iRSI(NULL,0,rsi_periodo,PRICE_CLOSE,0<0.7)

È lo stesso al contrario.

Può essere fatto attraverso while o bool? Sono in piena crisi di programmazione. Capisco la catena logica, ma le mie mani sono lente a convertirla in codice.

 
extralifes:

no attraverso se non funziona.

Dovrebbe essere,purché la condizione (d_mn_1>d_pl_1 && (d_mn_0-d_pl_0)>=2 sia corretta, di aprire solo un ordine di vendita a condizione che iRSI(NULL,0,rsi_periodo,PRICE_CLOSE,2)>0.7 && iRSI(NULL,0,rsi_periodo,PRICE_CLOSE,0<0.7)

È lo stesso al contrario.

Può essere fatto attraverso while o bool? Sono in piena crisi di programmazione. Capisco la catena logica, ma le mie mani sono lente a convertirla in codice.

aperto fino all'esaurimento dei soldi? o aperto una volta per barra? o una volta per tick?
 

Ciao, non voglio (e a volte lo faccio) essere preso da StopOut. Ho deciso di limitare il lotto con un valore, che non avrebbe preso StopOut nelle peggiori condizioni. Andando per tentativi ed errori per molto tempo. Forse qualcuno ha una soluzione?

Dati di ingresso:

- coppia di valute - non necessariamente EURUSD

- prezzo (prezzo di acquisto/vendita)

- StopLoss specificato in punti (si presume che lo scenario peggiore sia quello di non prendere uno StopOut anche se il livello di StopLoss viene raggiunto)

- impostare il valore del lotto

- Tutti gli altri valori devono essere ottenuti utilizzando le funzioni di MT4: Size 1 lot, leverage, cross rate.

Un codice sarebbe auspicabile.

In teoria capisco cosa mi serve: saldo meno la possibile perdita al livello StopLoss diviso per il margine. E questo valore dovrebbe essere più grande di StopOut (in termini percentuali)

 
Cmu4:

Aiuta a capire!

L'essenza dell'idea: mentre l'iMACD sta aumentando - manteniamo l'ACQUISTO, non appena inizia a diminuire - chiudiamo l'ACQUISTO e apriamo la VENDITA. Il confronto viene fatto utilizzando gli ultimi tre valori, escluso quello attuale.

Il codice ha un problema: apre ordini multipli a valori iMACD +-0, come vedo. Normalizedouble() non aiuta.

Ecco il codice:


int start()
  {

double MA1=iMACD(NULL,0,5,34,1,PRICE_CLOSE, MODE_MAIN,1), 
       MA2=iMACD(NULL,0,5,34,1,PRICE_CLOSE, MODE_MAIN,2),
       MA3=iMACD(NULL,0,5,34,1,PRICE_CLOSE, MODE_MAIN,3);
       
       
       
if (MA1>MA2 &&  MA2>MA3 && Napr==1)
    {Closeall();
    Napr=0;
    OrderSend (Symbol(), OP_BUY, Lot, Ask, 5, 0,0);}

if (MA1<MA2 && MA2<MA3 && Napr==0)
    {Closeall();
    Napr=1;
    OrderSend (Symbol(), OP_SELL, Lot, Bid, 5, 0,0);}



   return(0);
  }
Forse era questo il problema
 
ilunga:
aperto fino all'esaurimento dei soldi? o aperto una volta per barra? o una volta per tick?

La condizione è controllata ogni nuova barra. In questo caso, il lasso di tempo è orario. Questa condizione viene controllata all'inizio di ogni ora.
 
Vinin:

Forse questo era il problema

No... ho fatto come hai suggerito tu - rimane la stessa cosa.

Inoltre, ho cambiato il codice, dividendo separatamente in blocchi di apertura e chiusura per condizioni. È tutto uguale. Non so cosa fare adesso.

Ecco uno screenshot del tester, Expert Advisor per il tester nel trailer:

File: