Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 218

 
a196012a:

Ho completato il vostro codice con il blocco per aprire un ordine con volume 0,1 (subito dopo la funzione void start())

Ma per qualche motivo il programma non apre nessun ordine di volume aumentato (0,3 lotti ciascuno) in risposta alla chiusura di questi ordini

LE COSE CHE NON CAPISCO NEL TUO CODICE

1. Se ho capito bene, state assegnando МН=123 solo agli ordini con volume di 0,3 lotti.

Nella funzione datetime SearTim (int s) state cercando un ordine con MH=123 ma con un volume di 0,1.

Ma l'ordine con volume 0,1 non può avere МН=123, perché questo MM è assegnato solo agli ordini con volume 0,1

Nei corpi delle funzioni datetime SearTim(int s) e int sear(), e in particolare nei commenti, è necessario aprire un ordine con un volume di 0,3

Non capisco perché devo aprire un ordine con un volume maggiore nelle stesse condizioni più di una volta.

Avete già aperto ordini con un volume maggiore nel primo blocco.



Vi sarei molto grato se poteste scrivere del codice che apra un ordine con volume 0,3 dopo aver chiuso ogni ordine 0,1 e mantenga il valore di 0,1.

In questo caso, farò del mio meglio per trovare tutte le risposte alle mie domande nel vostro codice con l'aiuto della funzione Print (), le mie modeste conoscenze e i libri di riferimento.

NOTA:

Ho lo stesso tipo di ordini con volume 0,1 e 0,3 - solo SEL. Ecco perché, se non mi sbaglio, non dobbiamo calcolare il tipo di ordine (BAY o SEL) nella funzione int sear().

Vorrei ricordare ancora una volta che l'obiettivo finale del mio programma è quello di memorizzare il valore dell'ora (non un minuto, non un secondo, ma solo un'ora) dell'apertura dell'ordine 0.1 dopo che è stato chiuso al suo prezzo di chiusura da un ordine 0.3 che ha chiuso allo SL


Mi scuso che non posso spiegarvi molto, perché dovete conoscere il linguaggio di programmazione. Penso che tu sia già un programmatore e contavo su qualcuno che conosce la programmazione.

Prima devi imparare la programmazione. Se vi spiego cosa e come, sarà imparare un linguaggio di programmazione.

Guardate esempi di EA, come sono scritti e provate a scrivere programmi dall'inizio. E state cercando di scrivere un programma che è già complicato.

Guardate il tutorial e gli esempi su come scrivere comandi e moduli di esempio.

File:
MQL4.zip  2226 kb
 

Affronto questa domanda non complicata, ecco il blocco di chiusura.

Quando il profitto di un ordine diventa positivo, chiude quell'ordine e su quel profitto intero quanto è possibile una posizione in perdita. Se Perekr è abilitato.


Dobbiamo cambiarlo in modo che chiuda entrambe le posizioni solo quando il profitto di una posizione redditizia copre TUTTA la perdita di una posizione perdente, cioè in modo che il profitto di un ordine sia uguale o maggiore della perdita dell'altro.

if(Mas_Tip[1]>0)

     {

      if(Bidt-step*Point>=NormalizeDouble(Bid,Digits))

        {

         Profit=AccountBalance()-StartProfit;

         Askt=NormalizeDouble(Ask,Digits);

         Bidt=NormalizeDouble(Bid,Digits);

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

           {

            if(OrderSelect(i-1,SELECT_BY_POS)==true && OrderType()==OP_SELL && 

               OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

              {

               if(Razn<2)

                 {


                  if(Perekr && OrderProfit()>0 && max_lot>=Lots_per) //перекрытие

                    {

                     double profit=OrderProfit();

                     Print("закрываю по перекрытию");


                     ClosePosBySelect(OrderLots());

                     for(int f=OrdersTotal()-1;f>=0;f--)

                       {

                        if(OrderSelect(f,SELECT_BY_POS)==true && OrderType()==OP_BUY && 

                           OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

                          {

                           if(OrderProfit()<0)

                             {

                              if(profit>=MathAbs(OrderProfit()))

                                {

                                 Print("закрываю по перекрытию");


                                 ClosePosBySelect(OrderLots());

                                }

 

Amici, ciao. Ho bisogno dell'aiuto di un principiante.

Voglio essere avvisato via e-mail sul crossover di qualche indicatore da parte del prezzo. Ho capito come fare, ma non appena avviene l'incrocio dei prezzi, ricevo centinaia di email, e continuano a inviarle all'infinito fino alla chiusura della candela attuale. Cosa fare per inviare un solo messaggio? Ecco un esempio:

se((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL,0,2))){

bool res = SendMail("Buy Signal", "Buy Signal");

}


se((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL,0,2))){

SendMail("Sell Signal", "Sell Signal");

}

 
ev85:

Amici, ciao. Ho bisogno dell'aiuto di un principiante.

Voglio essere avvisato via e-mail sul crossover di qualche indicatore da parte del prezzo. Ho capito come fare, ma non appena avviene l'incrocio dei prezzi, ricevo centinaia di email, e continuano a inviarle all'infinito fino alla chiusura della candela attuale. Cosa fare per inviare un solo messaggio? Ecco un esempio:

se((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL,0,2))){

bool res = SendMail("Buy Signal", "Buy Signal");

}


se((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL,0,2))){

SendMail("Sell Signal", "Sell Signal");

}

È semplice con la parabolica, mettere una bandiera nella condizione. O una semplice variabile di tipo int e il valore cambia ad ogni segnale.

static bool flag;
 if(flag && iSAR(NULL, 0,Step,Maximum, 1) < iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) > iClose(NULL,0,2)){

 bool res = SendMail("Сигнал на покупку",  "Сигнал на покупку");
 flag = false;
 }


 if(!flag && iSAR(NULL, 0,Step,Maximum, 1) > iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) < iClose(NULL,0,2)){

 SendMail("Сигнал на продаж",  "Сигнал на продажу");
 flag = true;
 }
 

Buon giorno a tutti, potreste per favore aiutarmi con Trailing Stop. Ho scritto un Trailing Stop alla condizione che inizialmente ho SL = 100 e il Trailing Stop dovrebbe essere attivato quando il prezzo è 30 pip sopra l'apertura della posizione. Ma si modifica immediatamente dopo l'apertura della posizione e cambia lo SL standard a 30 e poi lo sposta.

void Trailing()

{

int SLoss = 1;

double StopL = NormalizeDouble (OrderOpenPrice() + SLoss*Point, Digits);

double StopL2 = NormalizeDouble (OrderOpenPrice() - SLoss*Point, Digits);

per (int i=OrdiniTotali() - 1; i>=0; i--)

{

se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

if (OrderType() == OP_BUY && OrderStopLoss() >= StopL)

{

se (Bid - StopL > TrailingStop*Point)

{

se (OrderStopLoss() < Bid-(TrailingStop+TrailingStep)*Point)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point, Digits), 0, 0))

Print("Errore di modifica dell' ordine!");

}

}

}

if (OrderType() == OP_SELL && OrderStopLoss() <= StopL2)

{

se (StopL2 - Ask > TrailingStop*Point)

{

se (OrderStopLoss() > Ask+(TrailingStop+TrailingStep)*Point)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point, Digits), 0, 0))

Print("Errore di modifica dell'ordine!");

}

}

}

}

}

}

}

 
Alexey Viktorov:

Con la parabolica è semplice, metti una bandiera nella condizione. O una semplice variabile di tipo int e il valore cambia ad ogni segnale.

Dimenticatevi di else - altrimenti la variabile statica rimane vera dopo il primo segnale
 
AlGuru:

Buon giorno a tutti, potreste per favore aiutarmi con Trailing Stop. Ho scritto un Trailing Stop alla condizione che inizialmente ho SL = 100 e il Trailing Stop dovrebbe essere attivato quando il prezzo è 30 pip sopra l'apertura della posizione. Lo modificherà subito dopo l'apertura della posizione e cambierà lo SL standard a 30 e poi lo sposterà.

...
Come può aiutare? Ho postato un modello lì, da cui puoi fare quello che vuoi.
 
Artyom Trishkin:
Ho solo dimenticato il resto - altrimenti la variabile statica rimane vera dopo il primo segnale

Che senso ha l'elza lì dentro? Penso che flag == true; o flag == false; che è nel codice

if(flag && ****

if(! flag && ****

Se c'è un'intersezione da una parte, aspettiamo un'intersezione dall'altra... E così il cerchio si chiude. Ma come collegarlo correttamente all'inizio, lasciatelo pensare da solo. O chiederglielo più tardi...

 
Alexey Viktorov:

Che senso ha l'elza lì dentro? Penso che flag == true; o flag == false; che è nel codice

Quando si attraversa da un lato, si aspetta il passaggio all'altro lato... ...e così il ciclo si chiude. Ma come collegarlo correttamente al primo inizio, lasciatelo pensare da solo. O chiederglielo più tardi...

Se ci sono due segnali su barre diverse in una direzione?

Avete solo lo swing.

Ma i segnali dovrebbero essere sempre inviati quando c'è un segnale, ma la decisione di segnalare viene presa separatamente.

Mi sembra che per ogni direzione sarebbe ottimale avere la propria bandiera, e scambiarla avanti e indietro. Ma non in modo che i segnali di una direzione dipendano dai segnali della direzione opposta.

 
Artyom Trishkin:

Se i due segnali sono su barre diverse nella stessa direzione?

Si ottiene solo un'oscillazione.

Ma i segnali dovrebbero essere sempre inviati quando c'è un segnale, ma la decisione di segnalare viene presa separatamente.

Mi sembra che per ogni direzione sia ottimale avere la propria bandiera, e scambiarla avanti e indietro. Ma non in modo che i segnali di una direzione dipendano dai segnali della direzione opposta.

Artem, ho iniziato la mia risposta a te con le seguenti parole

La parabolica ha una stretta alternanza, due segnali in una direzione, anche su barre diverse, sono impossibili. E non c'è bisogno di inventare proprio nulla per questo, non sferraglia nemmeno su barre zero come il MA.

Motivazione: