Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 58

 
teetrinker:

Myexpert.Time(10) dovrebbe restituire il tempo della decima barra del grafico? E come scriverlo correttamente?

Grazie

In teoria, sì, dovrebbe...

Il metodo Time , secondo la documentazione, ottiene il valore dell'elemento Time per l'indice specificato. È un metodo della classe CExpertBase, che è una classe base per CExpert e tutte le classi ausiliarie delle strategie di trading.

Caro sergeev ti dice bene... è meglio usare il Debugger per determinare il ruolo del metodo Time() nella vita del tuo EA...

 

Grazie, Yedelkin !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

E EnumToString(timeframe), bella funzione!!! E IO SONO BARAN!!!!!!

 
Ditemi per favore, ecco una funzione
 bool  PositionModify( ulong  PositionTicket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)
      {  MqlTradeRequest request  = {0};
         MqlTradeResult result = {0};
        request.action= TRADE_ACTION_SLTP; 
        request.order= PositionTicket; 
        request.price= price;
        request.symbol= Symbol();
        request.sl= stoploss;
        request.tp= takeprofit;
        return (OrderSend( request,   result    ));   
      }

La funzione sembra avere un ,,lato,,- request.symbol= Symbol(); Perché Symbol()? Qui è dove il simbolo per il quale abbiamo impostato TP e SL dovrebbe essere trasferito. Quindi, possiamo semplicemente rimuovere la stringa request.symbol= Symbol();, come se fosse uno stupido nada?

 

Per favore consigliate come impostare un ordine di rollover al livello di stop dell'ordine principale aperto e poi cancellarlo se l'ordine principale viene chiuso al TP?

Ho impostato entrambi gli ordini nel codice in una volta sola:

        
 // основной ордер +++++++++++++++++++++++++++++++++++++++      
        {
         request.action = TRADE_ACTION_PENDING;
         request.magic=magic_number;                  // ORDER_MAGIC
         request.symbol = "EURUSD";
         request.volume = NormalizeDouble(volume()/1,2);
         request.price=NormalizeDouble(Ask+StopLevel*_Point,_Digits);
         request.sl = NormalizeDouble(request.price - SL*_Point,_Digits);
         request.tp = NormalizeDouble(request.price + TP*_Point,_Digits);
         request.deviation=0;
         request.type=ORDER_TYPE_BUY_STOP;
         request.type_filling=ORDER_FILLING_FOK;
         
           {
            OrderSend(request,result);
            if(result.retcode==10009 || result.retcode==10008)
               Print("Установлен ордер BuyStop");
            else
              {
               Print(ResultRetcodeDescription(result.retcode));
                           
              }
           }      
 // переворотный ордер +++++++++++++++++++++++++++++++++++++++
        
         request.action = TRADE_ACTION_PENDING;
         request.magic=magic_number1;                  // ORDER_MAGIC
         request.symbol = "EURUSD";
         request.volume = NormalizeDouble(volume()/2,2);
         request.price=NormalizeDouble(Bid-(SL-45) *_Point,_Digits);
         request.sl = NormalizeDouble(request.price + SL*_Point,_Digits);
         request.tp = NormalizeDouble(request.price - (TP-900)*_Point,_Digits);
         request.deviation=0;
         request.type=ORDER_TYPE_SELL_STOP;
         request.type_filling=ORDER_FILLING_FOK;
         
           {
            OrderSend(request,result);
            if(result.retcode==10009 || result.retcode==10008)
               Print("Установлен ордер SellStop");
            else
              {
               Print(ResultRetcodeDescription(result.retcode));
               return;
              }
           }        
       } } 
}

L'ordine principale si apre e chiude al TP, e l'ordine di inversione si blocca. Se l'ordine principale ha chiuso allo stop, non ci sarebbe alcun problema )). Qual è la migliore funzione per chiudere?

Devo passare attraverso gli ordini pendenti e cancellarli in questo modo?

      {
         request.action = TRADE_ACTION_REMOVE;
         request.magic=magic_number1;                  // ORDER_MAGIC
         request.symbol = "EURUSD";
         request.volume = 0;
         request.price=0;
         request.sl = 0;
         request.tp =0;
         request.deviation=0;
         request.type=0;
         request.type_filling=0;
         
           {
            OrderSend(request,result);
O c'è un modo più semplice?


	          
 
Crucian: L'ordine principale si apre e chiude al TP e l'ordine di rollover si blocca. Se l'ordine principale avesse chiuso su stop, non ci sarebbero stati problemi )). Quale funzione sarebbe meglio usare per chiuderlo? Dovrei passare attraverso gli ordini pendenti e cancellarli in questo modo? O c'è un modo più semplice?

Quindi la domanda si riduce a come cancellare un ordine pendente che non è un ordine SL o TP quando si verificano certi eventi (in particolare, quando un ordine TP scatta in una posizione aperta).

Attualmente, tale ordine pendente può essere cancellato solo obbligatoriamente inviando la relativa richiesta "Delete Pending Order". Quindi dobbiamo monitorare sul lato terminale il verificarsi di certi eventi e inviare una richiesta. Ma a differenza della vostra variante, ci sono solo due campi da specificare nella richiesta, uno dei quali è la richiesta.ordine.

Nella situazione che menzioni, gli ordini OCO ("One Cansels Other(s)") sarebbero utili: a livello di TP, verrebbe piazzato un ordine con un volume pari alla posizione aperta, a livello di SL, verrebbe piazzato un ordine con il volume necessario per "invertire" la posizione. Se uno di questi ordini OCO scattasse, il secondo verrebbe automaticamente rimosso sul lato server. Tuttavia, durante tutta la vita di questo forum, gli sviluppatori della piattaforma sono stati irremovibili sul fatto di non introdurre alcun tipo di ordine aggiuntivo, compresi gli ordini OCO.

 
Yedelkin:

Tuttavia, da quando esiste questo forum, gli sviluppatori della piattaforma non hanno categoricamente accettato di introdurre alcun tipo di ordine aggiuntivo, compresi gli ordini OCO.

E perché introdurli quando può essere implementato programmaticamente?
 
A100: Perché inserirli quando si può farlo programmaticamente?
Prova a digitare la parola 'OCO' in latino e cirillico in una ricerca sul forum e leggilo.
 
Yedelkin:
Provate a digitare la parola 'OCO' in latino e cirillico in una ricerca sul forum e leggete.
OCO non è un mandato a sé stante e non è necessario inserirlo
 
A100: Il CCA non è un mandato a sé stante e non è necessario introdurlo
Capisco. Quindi non hai letto nulla. Ma lei è disposto a condividere la sua opinione. OK, la tua opinione è accettata: non hai bisogno di questo tipo di ordine.
 
Yedelkin:
Nonavete bisogno di questo tipo di ordine.
Alcune piattaforme hanno la possibilità di legare 1 (a volte 2) ordini CCA. In MT4/5 implemento programmaticamente una catena di ordini collegati (a volte abbastanza complessa) e trovo questa un'opzione più conveniente