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

 

Genera un sacco di errori


 

Scusa, alex12, ma sembri un bulldozer (senza offesa, è un termine accettato). Fai qualcosa con pezzi diversi e in qualche modo lo fai compilare, ma non capisci il significato del codice.

Contatta il servizio lavori.

 
alex12:

Genera un sacco di errori


Quando usate alcune delle funzioni di Igor Kim, assicuratevi di avere nel vostro codice le sue funzioni mancanti di cui il compilatore vi parla. Trovali nel suo ramo e scrivili nel tuo codice.
 
chief2000:
...

OrderOpenTime() mostra il tempo in cui la posizione è stata aperta, la mia domanda è come faccio a sapere il tempo in cui l'ordine STOP è stato impostato?
Il rapporto MT4 ha questo tempo, ma è possibile scoprirlo dal codice?


Ancora una volta.

Passate attraverso tutti i vostri ordini di stop in un ciclo "standard", e per voi stessi, staccate il valore di OrderOpenTime() per loro - questo deve essere il momento in cui essi (ciascuno di essi) sono stati impostati. Qui c'è un esempio per gli ordini di mercato - modificatelo un po', cioè, o rimuovete del tutto questa linea

se ((orderType != OP_BUY) && (orderType != OP_SELL)) continua;

o sostituirlo con i dati degli ordini di stop che ti interessano...

int orderCount = 0; // сбрасываем счетчик ордеров 
      // ------------------------------------------------Считаем только наши ордера---------------------------
   int orderType;
   for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))     continue; // если ордер не выбран, то идем на следующий открытый
      if(OrderCloseTime()!=0) continue;                          // если тикет принадлежит закрытому ордеру, то берем следующий открытый
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))   continue;
      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))   continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера 
          Time = O rderOpenTime();
         
                     
         
      orderCount++;                     // считаем ордера (не больше i)           

    }   
 
Roman.:


Ancora una volta.
Passate attraverso tutti i vostri ordini di stop in un ciclo "standard", e per voi stessi, staccate il valore di OrderOpenTime() per loro - questo deve essere il momento in cui essi (ciascuno di essi) sono impostati. Qui c'è un esempio per gli ordini di mercato - modificatelo un po', cioè, o rimuovete del tutto questa linea

se ((orderType != OP_BUY) && (orderType != OP_SELL)) continua;

o sostituirlo con i dati degli ordini di stop che ti interessano...

Qui, in questa fase ho incontrato un dilemma - ho bisogno del tempo di apertura di un ordine STOP per alcune "statistiche" e non vorrei che questo processo sia eseguito tutto il tempo, ma solo in una certa fase finale. Per questo motivo, non dobbiamo cercare gli ordini aperti in quel momento (OrdersTotal()), ma cercare tra gli ordini già chiusi => OrdersHistoryTotal().
Ma per gli ordini STOP che sono già stati chiusi, OrderOpenTime() restituisce il tempo di apertura della posizione, non il tempo in cui l'ordine è stato piazzato.
Di conseguenza, tutto si riduce a questo: è possibile recuperare il tempo che gli ordini STOP dalla lista di OrdersHistoryTotal(), quando sono stati impostati?
 
chief2000:
Qui è dove mi sono imbattuto in un dilemma - ho bisogno del tempo di apertura dell'ordine STOP per alcune "statistiche" e non vorrei che questo processo fosse eseguito tutto il tempo, ma solo in una certa fase finale. Per questo motivo, non dobbiamo cercare gli ordini aperti in quel momento (OrdersTotal()), ma cercare tra gli ordini già chiusi => OrdersHistoryTotal().
Ma per gli ordini STOP che sono già stati chiusi, OrderOpenTime() restituisce il tempo di apertura della posizione, non il tempo in cui l'ordine è stato piazzato.
Di conseguenza, tutto si riduce a questo: è possibile recuperare il tempo che gli ordini STOP dalla lista di OrdersHistoryTotal(), quando sono stati impostati?

Sì... La sfida... NON LO SO. Sembra che non si possa - soprattutto nelle "fasi finali"...

Devi monitorare costantemente questo processo e tenerne traccia - vedi il post sulle FAQ nella pagina precedente.

 
Roman.:

Sì... La sfida... NON LO SO. Sembra che non si possa - soprattutto nelle "fasi finali"...

Devi monitorare costantemente questo processo e tenerne traccia - vedi il post delle FAQ nella pagina precedente.

Se non si trova un'altra soluzione, userò gli ordini da OrdersTotal().
Grazie comunque!
 
In questo caso, è più facile scrivere su un file, meno fastidioso, e le statistiche possono essere organizzate come serve a voi, non al terminale.
 
FAQ:
In questo caso, è più facile scrivere su un file, meno seccature, e le statistiche possono essere organizzate come serve a voi, non al terminale.
Grazie!
 

Voglio scrivere un Expert Advisor sul modello a tenaglia.

Ho scelto

Low2=Low[iLowest(NULL,0,MODE_LOW,10,2)]    
High2=High[iHighest(NULL,0,MODE_HIGH,10,2)]     

if(Low[1]==Low2) bull_pincet=true;
if(High[1]==High2) bear_pincet=true;

   while(true)
      {
       
       if(Total==0 && bull_pincet==true)
        {
         sl=Low[1];
         if(sl<Step)sl=Step;
         tp=Ask+((Ask-sl)*k);
                  
         OrderSend(Symb,OP_BUY,Lts,Ask,3,sl,tp);
         return;
        }

        if(Total==0 && bear_pincet==true)
         {
          sl=High[1];
          if(sl<Step)sl=Step;
          tp=Bid-((sl-Bid)*k);
          OrderSend(Symb,OP_SELL,Lts,Bid,3,sl,tp);
          return;
         }
       break;
      }   

Sfortunatamente per me la condizione è sbagliata perché 'sl' è impostato a 100.00000 e 'tp' mostra un errore.

Ho deciso di aggiungere una condizione per considerare 1 tick.

static datetime TimeSaveH1  = 0;
int init()
{
     TimeSaveH1  = iTime( Symbol(), Period(), 0); // берем открытия время текущего бара
}

int start()
{
         if (TimeSaveH1!=iTime( Symbol(), Period(), 0))
            {
               TimeSaveH1=iTime( Symbol(), Period(), 0); 
            }  

Low2=Low[iLowest(NULL,0,MODE_LOW,10,2)]    
High2=High[iHighest(NULL,0,MODE_HIGH,10,2)]     

if(Low[1]==Low2 && TimeSaveH1===iTime( Symbol(), Period(), 0) bull_pincet=true;
if(High[1]==High2 && TimeSaveH1===iTime( Symbol(), Period(), 0) bear_pincet=true;
   while(true)
      {
       
       if(Total==0 && bull_pincet==true)
        {
         sl=Low[1];
         if(sl<Step)sl=Step;
         tp=Ask+((Ask-sl)*k);
                  
         OrderSend(Symb,OP_BUY,Lts,Ask,3,sl,tp);
         return;
        }

        if(Total==0 && bear_pincet==true)
         {
          sl=High[1];
          if(sl<Step)sl=Step;
          tp=Bid-((sl-Bid)*k);
          OrderSend(Symb,OP_SELL,Lts,Bid,3,sl,tp);
          return;
         }
       break;
      }   




}

il risultato è lo stesso. come posso risolvere il mio problema?

Motivazione: