Come controllare se un ordine è selezionato - pagina 12

 
grell:

Quindi questo è il mio punto. Le mie funzioni non hanno versatilità, ognuna è strettamente dedicata alla propria attività. Anche l'acquisto e la vendita sono separati. Quindi, che i numeri d'ordine cambino, che le fermate salgano, ma il biglietto e il mago rimarranno.

Beh, ti sei fatto prendere la mano con lo slosoll:)
 
tara:

Beh, ti sei fatto prendere la mano con le botte:)

Non ci sono state ancora mancanze. Sono un tiranno in questo senso:)
 
tara:
No, non come il formaggio nel burro, ma ho fatto la mia parte di servizio come tenente colonnello. Scusa se ti ho offeso :(
No, non si offenda, non sia obbligato se ho detto qualcosa di sbagliato, ma sinceramente. :)
 
borilunad:
No, non c'è motivo di offendersi, non devi impegnarti se ho detto qualcosa di sbagliato, ma sinceramente. :)
Non importa.
 
Ant_TL:

Mi hai frainteso. Così fa la metà delle persone per qualche motivo. Non ho bisogno nella funzione B() di elaborare quell'ordine, che è selezionato nella funzione A(). La funzione B() funziona con altri ordini, non importa quali, non ha niente a che vedere con la funzione A(); la funzione B() ha la sua propria logica. Può contare il numero di ordini, il loro profitto totale, guardare i loro commenti, TP SL, ecc. Il compito è quello di tornare dalla funzione B() alla funzione A() in modo tale che, indipendentemente da ciò che la funzione B() ha fatto con gli ordini, la logica di funzionamento della funzione A() al punto di chiamata della funzione B() da essa non sarà violata a causa del fatto che l'ordine selezionato dalla funzione A() prima che la funzione B() fosse chiamata non è più selezionato e l'ordine selezionato è un altro ordine casuale elaborato dalla funzione B() che molto probabilmente cerca anche ordini nel ciclo.


Continui a dimenticare che solo un ordine può essere selezionato alla volta. Exit = memorizza l'elenco degli ordini in un pool di risparmio (il tuo array). una variabile globale lastorder non è sufficiente. un'opzione migliore sarebbe lastords[ticket][function].
 
//+------------------------------------------------------------------+
//| Description included Functions                                   |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                       ORDERS.mq4 |
//|           Copyright © 2012. XrustSolution. mail:xrustx@gmail.com |
//|          https://www.youtube.com/user/opmlv http://forexrust.info |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012. XrustSolution. mail:xrustx@gmail.com"
#property link      "https://www.youtube.com/user/opmlv http://forexrust.info"
//+------------------------------------------------------------------+
//| Defines and Exports and Includes                                 |
//+------------------------------------------------------------------+
#define  ORDS_TOTAL 100
#define  HIST_TOTAL 100000
//+------------------------------------------------------------------+
//| Orders Property Indexes                                          |
//+------------------------------------------------------------------+
#define  ORD_TICK 0
#define  ORD_LOTS 1
#define  ORD_OPTM 2
#define  ORD_OPPR 3
#define  ORD_STOP 4
#define  ORD_TAKE 5
#define  ORD_CLPR 6
#define  ORD_CLTM 7
#define  ORD_PROF 8
#define  ORD_SWAP 9
#define  ORD_COMM 10
#define  ORD_EXPR 11
#define  ORD_SYMB 12
#define  ORD_COMN 13
//+------------------------------------------------------------------+
//| Extern and Global variables                                      |
//+---externs--------------------------------------------------------+

//+---globals--------------------------------------------------------+
int    gOrdsTotal[7];                     // number open orders
int    gOrdsTicks[ORDS_TOTAL][6];         // array of open ords tickets
double gOrdsProps[ORDS_TOTAL][6][12];     // array of open ords properties
double gPreOrdsProps[ORDS_TOTAL][6][12];
double gOrdsPrf[6];                       // open ords summary profit for order types
double gOrdsLts[6];                       // open ords summary lots for order types
//+------------------------------------------------------------------+
int    gHistTotal[7];                     // number closed orders
int    gHistTicks[HIST_TOTAL][6];         // array of closed ords tickets
double gHistProps[HIST_TOTAL][6][12];     // array of closed ords properties
double gHistPrf[6];                       // closed ords summary profit for order types
double gHistLts[6];                       // closed ords summary lots for order types
//+------------------------------------------------------------------+
//|   Function  :  double iOrdProps(OrderType,PropIndex,Count)       |
//+------------------------------------------------------------------+
double iOrdProps(int type,int indx,int co){int i;double res=0;
   i = gOrdsTicks[co][type];
   if(OrderSelect(i,SELECT_BY_TICKET)){
      if(OrderCloseTime()==0){
         switch(indx){
            case ORD_TICK : res = OrderTicket(); break;
            case ORD_LOTS : res = OrderLots(); break;
            case ORD_OPTM : res = OrderOpenTime(); break;
            case ORD_OPPR : res = OrderOpenPrice(); break;
            case ORD_STOP : res = OrderStopLoss(); break;
            case ORD_TAKE : res = OrderTakeProfit(); break;
            case ORD_CLPR : res = OrderClosePrice(); break;
            case ORD_CLTM : res = OrderCloseTime(); break;
            case ORD_PROF : res = OrderProfit(); break;
            case ORD_SWAP : res = OrderSwap(); break;
            case ORD_COMM : res = OrderCommission(); break;
            case ORD_EXPR : res = OrderExpiration(); break;
            default: res = 0; break;
         }
      }
   }else{
      return(EMPTY_VALUE);
   }
   return(res);
}
//+------------------------------------------------------------------+
//|   Function  :  double fOrdProps(OrderType,PropIndex,Count)       |
//+------------------------------------------------------------------+
double fOrdProps(int type,int indx,int co){return(gOrdsProps[co][type][indx]);}
//+------------------------------------------------------------------+
//|   Function  :  int fOrdsTicket(OrderType,Count)                  |
//+------------------------------------------------------------------+
int fOrdsTicket(int type, int indx = 0){return(gOrdsTicks[indx][type]);}
//+------------------------------------------------------------------+
//|   Function  :  int fOrdsTotal(OrderType)                         |
//+------------------------------------------------------------------+
int fOrdsTotal(int type = 6){return(gOrdsTotal[type]);}
//+------------------------------------------------------------------+
//|   Function  :  double fHistProps(OrderType,PropIndex,Count)      |
//+------------------------------------------------------------------+
double fHistProps(int type,int indx,int co){return(gOrdsProps[co][type][indx]);}
//+------------------------------------------------------------------+
//|   Function  :  int fHistTicket(OrderType,Count)                  |
//+------------------------------------------------------------------+
int fHistTicket(int type, int indx = 0){return(gHistTicks[indx][type]);}
//+------------------------------------------------------------------+
//|   Function  :  int fHistTotal(OrderType)                         |
//+------------------------------------------------------------------+
int fHistTotal(int type = 6){return(gOrdsTotal[type]);}
//+------------------------------------------------------------------+
//|          Function  : int HistRefresh(Magik,Comment,Symbol)       |
//|          Copyright © 2012, XrustSolution.  mail:xrustx@gmail.com |
//|          https://www.youtube.com/user/opmlv http://forexrust.info |
//+------------------------------------------------------------------+
//|          Description:                                            |
//+------------------------------------------------------------------+
int HistRefresh(int mn=-1,string comm="",string sy=""){int i,ii=0,type;bool iMn=true,iComm=true;
   if(mn<0){iMn=false;}
   ArrayResize(gHistTotal,7);
   ArrayInitialize(gHistTotal,0);
   ArrayResize(gHistProps,ORDS_TOTAL);
   ArrayInitialize(gHistProps,0);
   ArrayResize(gHistPrf,ORDS_TOTAL);
   ArrayInitialize(gHistPrf,0);
   ArrayResize(gHistLts,ORDS_TOTAL);
   ArrayInitialize(gHistLts,0);      
   if(StringLen(comm)<1){iComm=false;}
   for(i = OrdersHistoryTotal()-1; i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
         if(OrderType()>5){continue;}
         if(OrderCloseTime()==0){continue;}
         if(sy!=""){if(OrderSymbol()!=sy){continue;}}
         if(iMn){if(OrderMagicNumber()!=mn){continue;}}
         if(iComm){if(StringFind(OrderComment(),comm)<0){continue;}}
         type = OrderType();
         gHistProps[gHistTotal[type]][type][0] = OrderTicket();
         gHistProps[gHistTotal[type]][type][1] = OrderLots();
         gHistProps[gHistTotal[type]][type][2] = OrderOpenTime();
         gHistProps[gHistTotal[type]][type][3] = OrderOpenPrice();
         gHistProps[gHistTotal[type]][type][4] = OrderStopLoss();
         gHistProps[gHistTotal[type]][type][5] = OrderTakeProfit();
         gHistProps[gHistTotal[type]][type][6] = OrderClosePrice();
         gHistProps[gHistTotal[type]][type][7] = OrderCloseTime();
         gHistProps[gHistTotal[type]][type][8] = OrderProfit();
         gHistProps[gHistTotal[type]][type][9] = OrderSwap();
         gHistProps[gHistTotal[type]][type][10] = OrderCommission();
         gHistProps[gHistTotal[type]][type][11] = OrderExpiration();
         gHistPrf[type] += OrderProfit()+OrderSwap()+OrderCommission();
         gHistLts[type] += OrderLots();
         gHistTotal[type]++;// count for ordertypes
         gHistTotal[6]++;// all orders count
         ii++;
      }
   }   
   return(ii);
}
//+------------------------------------------------------------------+
//|          Function  : int OrdsRefresh(Magik,Comment,Symbol)       |
//|          Copyright © 2012, XrustSolution.  mail:xrustx@gmail.com |
//|          https://www.youtube.com/user/opmlv http://forexrust.info |
//+------------------------------------------------------------------+
//|          Description:                                            |
//+------------------------------------------------------------------+
int OrdsRefresh(int mn=-1,string comm="",string sy=""){int i,ii=0,type;bool iMn=true,iComm=true;
   if(mn<0){iMn=false;}
   if(StringLen(comm)<1){iComm=false;}
   ArrayResize(gOrdsTotal,7);
   ArrayInitialize(gOrdsTotal,0);
   ArrayResize(gOrdsTicks,ORDS_TOTAL);
   ArrayInitialize(gOrdsTicks,0);
   ArrayResize(gOrdsProps,ORDS_TOTAL);
   ArrayInitialize(gOrdsProps,0);
   ArrayResize(gOrdsPrf,ORDS_TOTAL);
   ArrayInitialize(gOrdsPrf,0);
   ArrayResize(gOrdsLts,ORDS_TOTAL);
   ArrayInitialize(gOrdsLts,0);
   for(i = OrdersTotal()-1; i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderType()>5){continue;}
         if(OrderCloseTime()!=0){continue;}
         if(sy!=""){if(OrderSymbol()!=sy){continue;}}
         if(iMn){if(OrderMagicNumber()!=mn){continue;}}
         if(iComm){if(StringFind(OrderComment(),comm)<0){continue;}}
         type = OrderType();
         gOrdsTicks[gOrdsTotal[type]][type] = OrderTicket();        
         gOrdsProps[gOrdsTotal[type]][type][0] = OrderTicket();
         gOrdsProps[gOrdsTotal[type]][type][1] = OrderLots();
         gOrdsProps[gOrdsTotal[type]][type][2] = OrderOpenTime();
         gOrdsProps[gOrdsTotal[type]][type][3] = OrderOpenPrice();
         gOrdsProps[gOrdsTotal[type]][type][4] = OrderStopLoss();
         gOrdsProps[gOrdsTotal[type]][type][5] = OrderTakeProfit();
         gOrdsProps[gOrdsTotal[type]][type][6] = OrderClosePrice();
         gOrdsProps[gOrdsTotal[type]][type][7] = OrderCloseTime();
         gOrdsProps[gOrdsTotal[type]][type][8] = OrderProfit();
         gOrdsProps[gOrdsTotal[type]][type][9] = OrderSwap();
         gOrdsProps[gOrdsTotal[type]][type][10] = OrderCommission();
         gOrdsProps[gOrdsTotal[type]][type][11] = OrderExpiration();
         gOrdsPrf[type] += OrderProfit()+OrderSwap()+OrderCommission();
         gOrdsLts[type] += OrderLots();
         gOrdsTotal[type]++;// count for ordertypes
         gOrdsTotal[6]++;// all orders count
         ii++;
      }
   }   
   return(ii);
}
//+------------------------------------------------------------------+
 
Rustam, grazie e buone vacanze.
 
Sì, buone feste anche a te! Cento grammi per tutti :)
 
TarasBY:

Nel mio codice, questo errore non si verifica, perché questa funzione è chiamata DOPO OrderSelect(). E il controllo nel codice è rimasto dai tempi in cui i codici venivano scritti senza una struttura comune di tutte le funzioni EA eseguibili.

Inoltre, la maggior parte delle mie funzioni contengono funzioni di gestione degli errori e sono molto attento ad evitarli. E ci sono anche una serie di funzioni che generano un errore, come la risposta che stavi cercando: "Ordine selezionato prima, o no?

P.S. A proposito, mi sono ricordato di una particolarità (può essere utile a qualcuno) di lavorare con le funzioni OrderSelect() delle librerie compilate: abbiamo selezionato un ordine (come - non principalmente), OrderTicket() - restituisce il numero di ordine selezionato. Ma se vogliamo ottenere le proprietà di questo ordine selezionato dalla funzione che si trova nella libreria compilata, non otterremo nulla. Dobbiamo selezionare di nuovo quell'ordine (di nuovo).

In effetti, ho incontrato una situazione in cui l'errore era causato da una delle funzioni di uso generale che avrebbe potuto essere utilizzata sia all'interno dei cicli di elaborazione degli ordini che al di fuori di questi cicli, cioè prima che l'ordine fosse selezionato, il che ha portato all'errore. Se vogliamo fare funzioni di servizio universale che lavorino con ordini che possono essere usati sia dopo che un ordine è stato selezionato sia prima, sia quando ci sono ordini aperti sia quando non ce ne sono, dovremmo usare un meccanismo come quello che ho citato per essere sicuri di non ottenere questo errore.

Ho già scritto in precedenza in questo thread sul fatto che la selezione dell'ordine non viene passata ai moduli di libreria e ritorno.

 
Ant_TL:

In effetti, ho incontrato una situazione in cui l'errore era causato da una delle funzioni di uso generale che potevano essere utilizzate sia all'interno che all'esterno dei cicli di elaborazione degli ordini, cioè prima che un ordine fosse selezionato, il che causava l'errore. Se vogliamo fare funzioni di servizio universale che lavorino con gli ordini e che possano essere usate sia dopo che un ordine è stato selezionato sia prima, sia quando ci sono ordini aperti sia quando non ci sono ordini, dobbiamo usare il meccanismo che ho menzionato nella pagina precedente per evitare questo errore.

Ho già scritto in precedenza in questo thread sul fatto che la selezione dell'ordine non viene passata ai moduli di libreria e ritorno.


Dovresti abituarti al fatto che ogni operazione di trading ha il suo ordine di selezione e non avrai problemi. E, sì, è stato scritto correttamente, solo un ordine può essere selezionato. Tutto il resto si risolve con gli array.