Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1294

 
Vladimir Pastushak:
Come faccio a capire il tipo di conto in modo programmatico? Copertura o rete?
   if(m_account.MarginMode()!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      Alert("Only Hedging!");
      return(INIT_FAILED);
     }
 

O come questo

AccountInfoSample

   m_label_info[3].Description(m_account.MarginModeDescription());

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

//+------------------------------------------------------------------+
//|                                        MarginModeDescription.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\AccountInfo.mqh>
CAccountInfo      m_account;     // account info wrapper
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   string Pr= m_account.MarginModeDescription();
   Alert(Pr);
  }
//+------------------------------------------------------------------+
 
Per favore, aiutatemi a trovare un EA (script) che metta una griglia di ordini pendenti virtuali con parametri specificati, o apra ordini (uno per uno) in una direzione specificata con un take specificato.
 

Per favore, ditemi dove si trova l'errore:

      for(int s=OrdersTotal()-1; s>=0; s--)          
         {
           if(o_orderInfo.SelectByIndex(s)) 
           if(o_orderInfo.OrderType()==ORDER_TYPE_SELL_STOP)
             {                 
               count_sell_stop++;
             }
         }  

      for(int s1=PositionsTotal()-1; s1>=0; s1--)          
         {
           if(o_orderInfo.SelectByIndex(s1)) 
           if(o_orderInfo.OrderType()==ORDER_TYPE_SELL)
             {                 
               count_sell++;
             }
         }  
         
      if(count_sell == 0 && count_sell_stop == 0)
         {
            sellstop_req3.action       = TRADE_ACTION_PENDING;
            sellstop_req3.symbol       = _Symbol;
            sellstop_req3.volume       = NormalizeDouble(lot_v, 2);
            sellstop_req3.price        = SymbolInfoDouble(sellstop_req3.symbol, SYMBOL_ASK) - 100*_Point;
            sellstop_req3.sl           = sellstop_req3.price + 110*_Point;
            sellstop_req3.type         = ORDER_TYPE_SELL_STOP;
            sellstop_req3.type_filling = ORDER_FILLING_RETURN;
            sellstop_req3.expiration   = ORDER_TIME_GTC;
            
            OrderSend(sellstop_req3, sellstop_res3);
         }
SELL_STOP - gli ordini sono calcolati, ma SELL non lo vuole. Secondo l'algoritmo, se non ce ne sono, l'ordine SELL_STOP viene piazzato, e se ce n'è almeno uno, l'ordine non viene piazzato.
 
Fergert Фергерт:

Per favore, ditemi dove si trova l'errore:

SELL_STOP - gli ordini vengono contati, ma SELL non vuole. Secondo l'algoritmo, se non ce ne sono, viene piazzato l'ordine SELL_STOP, e se ce n'è almeno uno, non viene piazzato nessun ordine.

Non confondere l'ORDINE LOCALE con la POSIZIONE.

//+------------------------------------------------------------------+
//|                                                     Script 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\PositionInfo.mqh>
#include <Trade\OrderInfo.mqh>
//---
CPositionInfo  m_position;                   // object of CPositionInfo class
COrderInfo     m_order;                      // object of COrderInfo class
//---
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int count_buys          = 0.0;
   int count_sells         = 0.0;
   int count_buy_limits    = 0.0;
   int count_sell_limits   = 0.0;
   int count_buy_stops     = 0.0;
   int count_sell_stops    = 0.0;
//---
   for(int i=PositionsTotal()-1; i>=0; i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY)
            count_buys++;
         else
            if(m_position.PositionType()==POSITION_TYPE_SELL)
               count_sells++;
        }
//---
   for(int i=OrdersTotal()-1; i>=0; i--) // returns the number of current orders
      if(m_order.SelectByIndex(i)) // selects the pending order by index for further access to its properties
        {
         if(m_order.OrderType()==ORDER_TYPE_BUY_LIMIT)
            count_buy_limits++;
         else
            if(m_order.OrderType()==ORDER_TYPE_SELL_LIMIT)
               count_sell_limits++;
            else
               if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)
                  count_buy_stops++;
               else
                  if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
                     count_sell_stops++;
        }
//--- you code
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
File:
Script_1.mq5  5 kb
 
Vladimir Karputov:

Non confondete l'ORDINE REMOTO con la POSIZIONE.

GRAZIE)) Capito...
 
Non capisco a cosa serva il parametro begin nella seconda variante della funzione onCalculate.
Ogni volta che la funzione onCalculate viene chiamata, è uguale a 0.
Stavo emettendo il valore di begin tramite la funzione print.
Il libro di riferimento dice che l'inizio è "da dove partono i dati significativi". Questo non mi dice nulla.
 
MisterRight:
Non capisco a cosa serva il parametro begin nella seconda variante della funzione onCalculate.
Ogni volta che la funzione onCalculate viene chiamata, è uguale a 0.
Ho fatto l'output del valore iniziale tramite la funzione print.
Il libro di riferimento dice che iniziare è "da dove partono i dati significativi". Questo non mi dice nulla.

Controlla i codici degli indicatori aperti di Example.

 
Mikhail Mishanin:

Guardate i codici degli indicatori aperti dell'esempio.

Ho guardato. Inizia sempre = 0.

Qui, ho estratto un pezzo di codice dall'indicatore AMA

se(inizio!=0)

PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodAMA+begin);


E cosa dovrebbe dirmi questo codice se la condizione begin!=0 non è mai vera?

 
Puoi dirmi cosa usare per contare gli ordini chiusi nella storia. Ho provato così:

HistorySelect(0,TimeCurrent());

Alert("Количество ордеров в истории:  ",HistoryOrdersTotal());
Alla fine dà delle sciocchezze, molto più degli ordini chiusi.
Motivazione: