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

 
var58:
Salve. Si prega di consigliare come prescrivere nel codice di MQL4 EA la regola di apertura di un ordine: dovrebbe esserci un ordine con un certo numero magico nel mercato; se non c'è tale ordine, l'EA non apre nulla secondo il suo algoritmo principale.

Questo è il massimo che si può fare:

void OnTick()
{
  Comment( IsCount(ORDER_TYPE_BUY_STOP, 5) ); // type - тип, mg - magic
}

//------- Вернёт количество
int IsCount(int type, int mg) {
int p=0;
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==mg) {
     if(OrderType()==type) {
      p++;
  }}}}
  return(p);
}
 

Come posso fare in modo che un utente possa riempire un array?

 
-Aleks-:

Come posso fare in modo che un utente possa riempire un array?

Chi altro può riempirlo se non l'utente?
 

Saluti, c'è un indicatore che disegna la cronologia degli ordini sul 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()
{
   int CountOrders=0;
   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";}

   //Расчет профита
   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();
         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");

   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);

      //Фон профита
      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();
   }
}

I singoli trade l'indicatore disegna correttamente (linea>sfondo>profitto), ma nella visualizzazione degli ordini chiusi c'è un piccolo "bug" (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 aiutatemi a risolvere il problema.

File:
 
Vitaly Muzichenko:
Chi altro può compilarla se non l'utente?

Intendo come riempirlo tramite le impostazioni. Diciamo attraverso una stringa, e poi mettiamo il suo valore in un array...

 
-Aleks-:

Intendo come riempirlo tramite le impostazioni. Diciamo attraverso una stringa, e poi mettiamo il suo valore in un array...

Come questo
StringToCharArray - Преобразование данных - Справочник MQL4
StringToCharArray - Преобразование данных - Справочник MQL4
  • docs.mql4.com
StringToCharArray - Преобразование данных - Справочник MQL4
 
Vitaly Muzichenko:

Questo è il massimo che si può fare:

void OnTick()
{
  Comment( IsCount(ORDER_TYPE_BUY_STOP, 5) ); // type - тип, mg - magic
}

//------- Вернёт количество
int IsCount(int type, int mg) {
int p=0;
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==mg) {
     if(OrderType()==type) {
      p++;
  }}}}
  return(p);
}
ORDER_TYPE_BUY_STOP è evidenziato in MQL4 Editor, non in MQL4 Help. Domanda: funziona in MQL4, corrisponde al tipo OP_BUYSTOP ? Solo che non ho ancora il tempo di controllare.
 
Vitaly Muzichenko:

Questo è il massimo che si può fare:

void OnTick()
{
  Comment( IsCount(ORDER_TYPE_BUY_STOP, 5) ); // type - тип, mg - magic
}

//------- Вернёт количество
int IsCount(int type, int mg) {
int p=0;
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==mg) {
     if(OrderType()==type) {
      p++;
  }}}}
  return(p);
}

Vitaly Muzichenko:

Примерно так можно:

void OnTick()
{
  Comment( IsCount(ORDER_TYPE_BUY_STOP, 5) ); // type - тип, mg - magic
}

//------- Вернёт количество
int IsCount(int type, int mg) {
int p=0;
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==mg) {
     if(OrderType()==type) {
      p++;
  }}}}
  return(p);
}

Спасибо большое, попробую. 

 
Vitaly Muzichenko:
È più o meno così.

Grazie!

 
Artyom Trishkin:
ORDER_TYPE_BUY_STOP è evidenziato in MQL4 Editor, ma non in MQL4 Help. Domanda: funziona in MQL4, corrisponde al tipo OP_BUYSTOP? Solo che non ho ancora il tempo di controllare.

Sì, funziona al 100%, è l'unico modo in cui scrivo ora. Ora molte cose sono migrate da Cinque a Quattro.

Anche questo funziona, anche se il compilatore giurava che fosse una linea di tendenza

    ObjectSetInteger(chart_ID,nm,OBJPROP_TIME,t1);
    ObjectSetDouble(chart_ID,nm,OBJPROP_PRICE,p1);
    ObjectSetInteger(chart_ID,nm,OBJPROP_TIME,1,t2);
    ObjectSetDouble(chart_ID,nm,OBJPROP_PRICE,1,p2);