[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 563

 

delf:

L'ultimo ordine deve essere chiuso in qualsiasi direzione e l'ordine successivo deve aprirsi nell'altra direzione (quando le condizioni sono soddisfatte, rispettivamente).

Opzione più rigorosa

#define OrderBuy  0
#define OrderSell 1
int NewOrder;
int RezultatSend; 

int start()
{
... 
... 

if(OrdersTotal()==0)
{
if(NewOrder==OrderBuy)
   {
   if(/*Условие для Buy*/)
      { RezultatSend=OrderSend(/*...buy*/);     //Ставим Buy
        if(RezultatSend!=-1)NewOrder=OrderSell; //Если ставка прошла
      }
   }
 else
   {
   if(/*Условие для Sell*/)
      { RezultatSend=OrderSend(/*...*/);       //Ставим Sell
        if(RezultatSend!=-1)NewOrder=OrderBuy; //Если ставка прошла
      }
   }
}

...
...

}  
 

abeiks:

Per un po' di tempo ho provato a rielaborare il blocco di chiusura degli acquisti per chiudere solo le ultime due posizioni di acquisto, ma non ci riesce. Puoi dire a come rifare il blocco ?

È più facile e conveniente fare una funzione (blocco) per chiudere un'ultima posizione. Ed eseguirlo due volte. In un ciclo, o solo in una fila.
 
abeiks:

Per un po' di tempo ho provato a rielaborare il blocco di chiusura degli acquisti per chiudere solo le ultime due posizioni di acquisto, ma non ci riesce. Puoi dire a come rifare il blocco ?

Qualche tempo fa vi ho dato un algoritmo di soluzione per trovare le ultime posizioni. E poi cosa fare con loro è IMPORTANTE: contare, cancellare, modificare gli STOP. Se non sei capace di scrivere codice almeno "a immagine e somiglianza", non è tuo (programmazione)...
 
rigonich:



Grazie!

 
peshihod:
È più facile, e più conveniente, fare una funzione (blocco) per chiudere un'ultima posizione. Ed eseguirlo due volte. In un ciclo, o solo in una fila.

Grazie, è una buona opzione che proverò anche io.

 
delf:

Devo essermi espresso male :(

C'è un algoritmo per aprire gli ordini.

Ho bisogno che in qualsiasi variante di chiusura dell'ultimo ordine, il seguente sia stato aperto in un'altra direzione (quando le condizioni di conseguenza appaiono).

Tutto funziona, ma se ho chiuso con uno stop loss, per esempio, per vendere, e le condizioni per aprire una vendita in questa direzione, l'apertura continua. Ciò di cui abbiamo bisogno è aspettare le condizioni per comprare.

Cioè, dobbiamo controllare l'ultimo ordine chiuso, in modo che non coincida con quello di apertura (alternanza buy-sell-buy-sell). È in funzione solo un ordine o l'attesa di un segnale.

Capisco che probabilmente dovremmo usare OrdersHistoryTotal(), ma come sarebbe in un EA funzionante?

Grazie.


Questo è probabilmente il caso da qualche parte. Ma se ci sono molti ordini nella storia è meglio usare il proprio order book. https://www.mql5.com/ru/articles/1404https://www.mql5.com/ru/articles/1390
//+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
void CloseOrder(string signal)
   {
   int      i,Ticket=-1,error; 
   double   Price;
   datetime time=0;
   for (i=0;i<OrdersHistoryTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ", error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic
      ||OrderClosePrice()==OrderStopLoss())
         {
         if(OrderCloseTime()>time)
            {
            time=OrderCloseTime();Ticket=OrderTicket();
         }
      }
   }
   if(!OrderSelect(Ticket,SELECT_BY_TICKET,MODE_HISTORY))
      {
      error=GetLastError();Print("Ошибка OrderSelect() = ",error);
   }
   if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL&&signal=="CloseSELL")return;
   if(signal=="CloseBUY")Price=NormalizeDouble(Bid,Digits);
   if(signal=="CloseSELL")Price=NormalizeDouble(Ask,Digits);
   for (i=0;i<OrdersTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ",error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic)
         {
         if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL||signal=="CloseSELL")
            {
            Ticket=OrderClose(OrderTicket(),OrderLots(),Price,0,CLR_NONE);
         }
      }
      if(Ticket<0)
         {
         error=GetLastError();Print("Ошибка = ",error);
      }
   }
   return;
}
       
 
peshihod:

Un'opzione più severa

Grazie mille a tutti quelli che hanno risposto, risultato raggiunto, proprio quello di cui avevo bisogno.
 
delf:

Devo essermi espresso male :(

C'è un algoritmo per aprire gli ordini.

Ho bisogno che in qualsiasi variante di chiusura dell'ultimo ordine, il seguente sia stato aperto in un'altra direzione (quando le condizioni di conseguenza appaiono).

Tutto funziona, ma se ho chiuso con uno stop loss, per esempio, per vendere, e le condizioni per aprire una vendita in questa direzione, l'apertura continua. Ciò di cui abbiamo bisogno è aspettare le condizioni per comprare.

Cioè, dobbiamo controllare l'ultimo ordine chiuso, in modo che non coincida con quello di apertura (alternanza buy-sell-buy-sell). È in funzione solo un ordine o l'attesa di un segnale.

Capisco che probabilmente dovremmo usare OrdersHistoryTotal(), ma come sarebbe in un EA funzionante?

Grazie.

Se volete imparare a programmare, potete o guardare il codice di altri (a questo serve CodaBase), o procedere dall'algoritmo della soluzione del problema. Chiedere di scrivere codice per voi è il modo più disperato di imparare. Il più delle volte otterrete una soluzione mal codificata al vostro problema, qualcosa come (allegoricamente) il vostro vicino che vi chiama alla porta ogni minuto e vi chiede "come ti chiami" - si tratta di calcoli inutili (superflui).

L'algoritmo per risolvere il vostro problema può essere il seguente. Per prima cosa, dovete assicurarvi di non avere i "vostri" ordini. Questo problema, se non è per il tester (dove possiamo limitare la soluzione alla condizione if (OrdersTotal() == 0), si risolve con ricerche di ordini usando filtri per la corrispondenza di OrderMagicNumber() e Symbol(). Poi controlli la condizione (secondo la tua strategia) per aprire l'ordine. Se c'è un segnale, allora usando la ricerca di OrdersHistoryTotal() (di solito è l'ultimo della lista), calcola l'OrderType() dell'ultimo ordine chiuso. Se il segnale per aprire l'ordine e il tipo dell'ultimo ordine chiuso non coincidono, apri l'ordine in base al segnale.

Questo approccio comporta calcoli minimi e riduce notevolmente il tempo di ottimizzazione dell'Expert Advisor nel tester.

 
TarasBY:
Qualche tempo fa vi ho dato l'algoritmo per risolvere la ricerca delle ultime posizioni. E poi cosa fare con loro non importa: contare, cancellare, modificare STOP. Se non sei capace di scrivere codice almeno "a immagine e somiglianza", non è tuo (programmazione)...


Sì, sono d'accordo, la programmazione non è il mio forte, quindi sto imparando e facendo domande qui. Ho provato ad aggiungere la chiusura delle posizioni al tuo algoritmo ma non è riuscito (tutte le posizioni di acquisto si chiudevano) così ho deciso di affrontare il problema da un'altra angolazione e vedere la soluzione di chiudere le ultime due posizioni di acquisto su un blocco di chiusura già pronto che mi è stato fornito e offerto.

Vi sarei molto grato se poteste mostrarmi come chiudere le ultime due posizioni di acquisto. Capirò dove ho sbagliato.

double profits_buy_2pos()
{
    int ordercount = 0, OpenOrders = OrdersTotal();
    double pr_buy = 0;
    for (int cnt = OpenOrders - 1; cnt >= 0; cnt--)   // scan all orders and positions. ..
    {
        if (!OrderSelect (cnt, SELECT_BY_POS)) return (0.0);
        if (OrderSymbol() != Symbol()) continue;
        if (OrderMagicNumber() != magic) continue;
        if (OrderType() != OP_BUY) continue;
        pr_buy += OrderProfit();
        ordercount++;
        if (ordercount == 2) break;
    } 
    Print ("::::::::::::::::::::::::: pr_buy2 = ", pr_buy);   
    Print ("::::::::::::::::::::::::: ordercount = ", ordercount);    
    return (pr_buy);   
}

 
TarasBY:

Se volete imparare a programmare, o analizzate il codice di altre persone (CodaBase serve a questo) o procedete dall'algoritmo per il compito da svolgere. Chiedere di scrivere codice per voi è il modo più disperato di imparare. Il più delle volte non otterrete il codice migliore per il vostro compito, qualcosa come (allegoricamente) quando il vostro vicino ogni minuto suona il vostro campanello e vi chiede "come ti chiami" - si tratta di calcoli inutili (superflui).

Sono completamente d'accordo con te. Hai ragione al 100%. Questo è il modo giusto e ho cercato di seguirlo. Tuttavia, studiare MQL4 senza i libri di testo e leggere senza motivo non ha portato a nulla. Ho dovuto comunque analizzare il codice di qualcun altro, dato che non potevo mettere le mie idee folli nel programma per la maggior parte. Ho iniziato a costruire la strategia in ....excel (è più vicino a me e più comprensibile). Per quanto riguarda le basi della strategia, ha avuto molto successo e chiaro (sulla storia, naturalmente). Ma inoltre dovrei prendere in considerazione le peculiarità del trading: spread fluttuante, swap, peculiarità della casa di intermediazione, è difficile inserire tutto questo in formule exel. Così ho deciso di analizzare la differenza tra il profitto in excel e MQL. Francamente la differenza è eccessiva, non a mio favore. Non lo so ancora, analizzerò ogni posizione, forse l'Expert Advisor ha fatto un errore, ma questo dipende da me.

Comunque, le brave persone di questo forum mi hanno aiutato a risolvere un problema specifico, che grande umano grazie per.