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

 

Ho deciso di aggiungere alla domanda precedente.

1)

Supponiamo che io abbia un segnale - quando lo spread si allarga bruscamente (sulle notizie)

Chiudere tutte le operazioni in corso

Ma gli ordini non si chiuderanno o apriranno solo durante le notizie.

Quindi, se prendiamo un comando, diciamo OrderClose, lo mettiamo in un ciclo + Sleep (3000) e lo eseguiamo finché non si chiude

2)

Se leghiamo una variabile interna al pulsante e assegniamo il valore premuto/chiuso alla possibilità di apertura dell'ordine, funzionerà in tempo reale?

 
trader781:

Ho deciso di aggiungere alla domanda precedente.

1)

Supponiamo che io abbia un segnale - quando lo spread si allarga bruscamente (sulle notizie)

Chiudere tutte le operazioni in corso

Ma gli ordini non si chiudono o si aprono solo durante le notizie.

Quindi, se prendiamo un comando, diciamo OrderClose, lo mettiamo in un ciclo + Sleep (3000) e lo eseguiamo finché non si chiude

2)

Se leghiamo una variabile interna al pulsante e assegniamo il valore premuto/chiuso alla possibilità di apertura dell'ordine, funzionerà in tempo reale?

1) Non è Sleep(3000) ma la gestione degli errori che aiuta.
 

Saluti, sto scrivendo un indicatore che disegna lastoria degli ordini su un grafico, codice:

//+------------------------------------------------------------------+
//|                                                      history.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

extern int        MagicNumber                = 1110;
extern datetime   HistoryOrdersFromDateTime  = 0;
extern color      SellColor                  = clrRed;
extern color      BuyColor                   = clrBlue;
extern color      ProfitColor                = clrWhite;
extern bool       DeleteHistoryOrders        = false;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+

void start()
{
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
      {
         if(HistoryOrdersFromDateTime<OrderCloseTime())
         {
            if((TimeCurrent()-OrderCloseTime())>60)
               HistoryOrders();
         }
      }
   }
}

void HistoryOrders()
{
   double b=OrderOpenPrice(), d=OrderClosePrice(), lots=OrderLots(), Profit=0;
   datetime a=OrderOpenTime(), c=OrderCloseTime(), close_time;
   string Ticket=(string)OrderTicket(), type="Sell", symbol=OrderSymbol(), comment=OrderComment(), Background;
   color col=SellColor;
   if(OrderType()==0) {col=BuyColor; type="Buy";}

   if(DeleteHistoryOrders==false)
   {
      //Начальная точка
      ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJ_ARROW,0,a,b);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_ARROWCODE,1);
      
      //Линия  
      ObjectCreate("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJ_TREND,0,a,b,c,d);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_WIDTH,1);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_STYLE,STYLE_DOT);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_RAY,0);
  
      //Конечная точка
      ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJ_ARROW,0,c,d);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_ARROWCODE,3);

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               Ticket=(string)OrderTicket();
            }  
         }      
      }
      
      //Размер фона  
      for(int i=2; i<StringLen(DoubleToString(Profit,2)); i++)
         StringAdd(Background,"g");
      
      //Фон профита
      ObjectCreate("#"+Ticket+" Background",OBJ_TEXT,0,c,d);
      ObjectSet("#"+Ticket+" Background",OBJPROP_ANCHOR,ANCHOR_LOWER);
      ObjectSetText("#"+Ticket+" Background",Background,10,"Webdings",col);
      ObjectSet("#"+Ticket+" Background",OBJPROP_PRICE1,d);
      ObjectSet("#"+Ticket+" Background",OBJPROP_TIME1,c+Period());
  
      //Профит
      ObjectCreate("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJ_TEXT,0,c,d);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_ANCHOR,ANCHOR_LOWER);
      ObjectSetText("#"+Ticket+" Profit: "+DoubleToString(Profit,2),DoubleToString(Profit,2),10,"Arial",ProfitColor);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_PRICE1,d);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_TIME1,c+Period());
   } else ObjectsDeleteAll(0, "#"+Ticket+" ");  
}

void OnDeinit(const int reason)
{  
   //Удалаение истории ордеров
   for(int i=0; i<OrdersHistoryTotal(); i++)
   {
      DeleteHistoryOrders=true;
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         HistoryOrders();
   }
}

L'indicatore disegna correttamente i singoli trade (linea>sfondo>profitto), ma c'è un piccolo "bug" nella visualizzazione dei set di ordini chiusi (screenshot allegato), le linee si sovrappongono allo sfondo e al profitto (linea(1)>sfondo>profitto>linea(2)>linea(3)>linea(4) .. . . .).

Dovrebbe essere così: (linea(1)> linea(2)> linea(3)> linea(4) . . . >fon>profitto). Varie manomissioni non hanno avuto successo, per favore aiutate a perfezionare.

File:
 
ilnur17021992:

Saluti, sto scrivendo un indicatore che visualizza lacronologia degli ordini su un grafico,


L'indicatore rende correttamente una singola operazione (linea>sfondo>profitto), ma nella visualizzazione di un insieme di ordini chiusi c'è un piccolo "shoosh" (allego uno screenshot), le linee (linea(1)>sfondo>profitto> linea(2)> linea(3)> linea(4) ... . ).

Dovrebbe essere così: (linea(1)> linea(2)> linea(3)> linea(4) . . . >fon>profitto). Varie manomissioni non hanno avuto successo, per favore aiutate a perfezionare.

Prova ad assegnare linee e icone alla proprietà OBJPROP_BACK sullo sfondo.
ObjectSetInteger - Графические объекты - Справочник MQL4
ObjectSetInteger - Графические объекты - Справочник MQL4
  • docs.mql4.com
ObjectSetInteger - Графические объекты - Справочник MQL4
 
Alexey Viktorov:
Prova ad assegnare la proprietà OBJPROP_BACK alle linee e alle icone sullo sfondo.
Non è un'opzione, le linee sono disegnate sullo sfondo (dietro le candele). Il disegno dovrebbe essere sopra le candele: candele>linee>profitto sfondo>profitto
File:
 
ilnur17021992:
Non è un'opzione, quindi le linee sono nello sfondo (dietro i candelieri), e il disegno dovrebbe essere sopra i candelieri: candelieri>linee>profitto>profitto sfondo
Poi solo la sequenza di disegno sul grafico. Oppure, quando si disegnano lo sfondo e il profitto, dovremmo controllare l'esistenza di questi oggetti per tempo, leggere il valore del profitto nell'oggetto OBJ_TEXT e aggiungerlo al profitto dell'ordine corrente. Poi dovremmo cancellare lo sfondo e il profitto e disegnarli di nuovo.
A proposito, questo eliminerà un ciclo aggiuntivo per il calcolo dei profitti.

Puoi fare questo
      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               Ticket=(string)OrderTicket();
            }  
         }      
      }
si definisce il profitto all'inizio insieme a tutti gli altri parametri dell'ordine.

ps Per favore. Inserisci un'immagine con questo pulsante
 
Alexey Viktorov:
Poi solo la sequenza di disegno sul grafico. Oppure, quando si disegnano sfondo e profitto, dovremmo controllare la disponibilità di questi oggetti per tempo, leggere il valore del profitto nell'oggetto OBJ_TEXT e aggiungerlo al profitto dell'ordine corrente. Poi dovremmo cancellare lo sfondo e il profitto e disegnarli di nuovo.
A proposito, questo eliminerà la necessità di un ciclo aggiuntivo per il calcolo del profitto.
Si definisce il profitto all'inizio insieme a tutti gli altri parametri dell'ordine.

Come posso impostare questa sequenza di disegno, per esempio, prima disegnare tutti i punti e le linee che li collegano, e poi procedere a disegnare lo sfondo e il profitto?

 
ilnur17021992:

Come faccio a impostare questa sequenza di disegno, diciamo, prima disegnare tutti i punti e le linee che li collegano, e poi procedere a disegnare lo sfondo e il profitto?

Beh, se secondo la mia prima ipotesi, allora sì. E poi ho avuto subito un pensiero improvviso e non ho cancellato la prima frase, ma mi piace di più la seconda.

È meglio considerare questa variante.

ObjectFind() poi se l'oggetto è trovato ObjectGetString() lo converte da testo a numero, aggiunge il profitto dell'ultimo ordine al valore ottenuto, cancella l'OBJ_TEXT obsoleto e ne disegna uno nuovo.
Se è il primo o l'unico ordine chiuso in questa barra, disegniamo semplicemente
OBJ_TEXT ed è tutto.
Per facilitare le cose, dovremmo specificare l'ora di apertura del bar invece del biglietto. O il biglietto è necessario per un ulteriore lavoro?

 
Alexey Viktorov:
Beh, se è la mia prima ipotesi, è così. E poi ho avuto subito un pensiero improvviso e non ho cancellato la prima frase, ma mi piace di più la seconda.

È meglio considerare questa variante.

ObjectFind() poi se l'oggetto è trovato ObjectGetString() lo converte da testo a numero, aggiunge il profitto dell'ultimo ordine al valore ottenuto, cancella l'OBJ_TEXT obsoleto e ne disegna uno nuovo.
Se è il primo o l'unico ordine chiuso in questa barra, disegniamo semplicemente
OBJ_TEXT ed è tutto.
Per facilitare le cose, dovremmo specificare l'ora di apertura del bar invece del biglietto. O il biglietto è necessario per un ulteriore lavoro?

Sì, il biglietto è necessario per l'analisi successiva della storia. Grazie per il consiglio di ridisegnare. Ho risolto il problema un po' più facilmente aggiungendo questo controllo e ridisegnando il codice:

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               ProfitTicket=(string)OrderTicket();
               CountOrders++;
            }  
         }      
      }
      
      //Перерисовка фона и профита
      if(CountOrders>1)
      {  
         ObjectDelete("#"+Ticket+" Background");
         ObjectDelete("#"+Ticket+" Profit: "+DoubleToString(Profit,2));
         Ticket=ProfitTicket;      
      }

Non so se è corretto, ma in linea di principio disegna come dovrebbe essere (linee>fon>profitto):

 
ilnur17021992:

Sì, il biglietto è necessario per analizzare la storia in seguito. Ho risolto il problema un po' più facilmente aggiungendo un tale controllo e ridisegno al codice:

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               ProfitTicket=(string)OrderTicket();
               CountOrders++;
            }  
         }      
      }
      
      //Перерисовка фона и профита
      if(CountOrders>1)
      {  
         ObjectDelete("#"+Ticket+" Background");
         ObjectDelete("#"+Ticket+" Profit: "+DoubleToString(Profit,2));
         Ticket=ProfitTicket;      
      }

Fondamentalmente disegna correttamente (linee>sfondo>profitto):

Beh, va bene, sono felice per te.
Motivazione: