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

 
viktor:
Dimmi dove puoi scaricare MT4 1320
Alpari
 

L'indicatore OBV in mt5 non ha la possibilità di selezionare il tipo di calcolo del prezzo

In mt4 questa opzione è disponibile.

Perché?

Infatti, OBV è calcolato come la somma di tutto il volume su tutta la storia, dove la candela è giù il volume è "negativo"
Quindi perché in mt4 è possibile selezionare il tipo di prezzo per il calcolo dell'indicatore? se non è coinvolto nel calcolo

 

C'è una parte di codice per calcolare il numero separato di ordini di acquisto e di vendita. (b - ordini di acquisto, s - ordini di vendita)

Poi voglio scrivere una condizione per cui se un nuovo ordine viene aperto o un ordine esistente viene chiuso. Cioè abbiamo bisogno di confrontare il numero di ordini aperti in precedenza e il numero di modifiche successive, ma non so come scrivere questo nel codice. Come posso salvare i cambiamenti nel numero di ordini? Per favore, aiutatemi.

doppio LB=0, LS=0;
doppio RaznSB=0, RaznBS=0;
int b=0,s=0;
int izmb=0, izms=0;
per (int i=0; i<OrdersTotal(); i++)
{
se(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
se (OrderSymbol()==Symbol())
{
int tip = OrderType();
se (tip==OP_BUY)
{
LB += OrderLots();
b++;
}
se (tip==OP_SELL)
{
LS += OrderLots();
s++;
}
}
}
}
se (izmb>b ||izmb<b || izms>s || izms<s) {
izmb=b;
izms=s
}
 
Roman Sharanov:

L'indicatore OBV in mt5 non ha la possibilità di selezionare il tipo di calcolo del prezzo

In mt4 questa opzione è disponibile.

Perché?

Infatti, OBV è calcolato come la somma di tutto il volume su tutta la storia, dove la candela è giù il volume è "negativo"
Quindi perché è possibile selezionare il tipo di prezzo per l'indicatore durante il suo calcolo in mt4? se non è coinvolto nel calcolo

Una buona domanda è metà della risposta.

 
scomoroh:

C'è una parte di codice per calcolare il numero separato di ordini di acquisto e di vendita.

E c'è un posto per inserirlo)

 
Artyom Trishkin:

Una domanda ben definita contiene metà della risposta.

Quindi la scelta del tipo di prezzo in mt4 ts OBV non significa nulla e non influenza nulla?
 
MakarFX:

E c'è un posto dove metterlo).

Allora ripeterò la domanda.

C'è una parte di codice per calcolare il numero separato di ordini di acquisto e di vendita. (b - ordini di acquisto, s - ordini di vendita)

Poi ho scritto una condizione per cui, se un nuovo ordine viene aperto o un ordine esistente viene chiuso, viene attivata l'azione successiva. Cioè dobbiamo confrontare il numero di ordini aperti in precedenza e il numero di modifiche successive, ma non so come scrivere questo nel codice. Come posso salvare i cambiamenti nel numero di ordini? Per favore, aiutatemi.


   double LB=0,LS=0;
   int b=0,s=0;
   int izmb=0, izms=0;
   
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      { 
         if (OrderSymbol()==Symbol())
         { 
            int tip = OrderType(); 
            if (tip==OP_BUY)             
             {  
               LB  += OrderLots();
               b++; 
             }                                         
            if (tip==OP_SELL)        
             {
               LS  += OrderLots();
               s++;
            } 
         }
     }     
   }
   if (izmb>b ||izmb<b || izms>s || izms<s){ //условие сравнения количества ордеров, изменилось или нет,
    izmb=b;                                   //если изменилось то присваиваем новое значение, как его сохранить? Ведь с новым тиком
    izms=s                                    // оно опять будет равно "0"???
     }
 
Vitaly Muzichenko:

Semmai bisogna farlo staticamente, altrimenti si resetta.

Di solito rendo le bandiere globali. Naturalmente nel corpo della funzione sarà ridichiarare e statico è necessario. Ma perché nessuno ha notato che mancano le parentesi graffe)))) stampa & assegnazione dovrebbero essere tra parentesi)

E senza statica, ovviamente, stamperà su ogni chiamata di funzione, poichéprintsimbol="" diventerà ZERO e al simbolo verrà assegnato il valore corrente)

static string symbol, printsimbol="";
      long currChart=ChartFirst(); int i=0;
      while(currChart>=0)
        {
         if(ChartGetInteger(currChart,CHART_BRING_TO_TOP,0)==true) 
           { 
            if(ChartSymbol(currChart)!=symbol)
                {
                 symbol=ChartSymbol(currChart);
                 if(printsimbol!=symbol)
                   { Print(symbol);printsimbol=symbol;}
                }
           } 
         currChart=ChartNext(currChart);  i++;
        }
 
scomoroh:

Allora ripeterò la domanda.

C'è una parte di codice per calcolare il numero separato di ordini di acquisto e di vendita. (b - ordini di acquisto, s - ordini di vendita)

Poi ho scritto una condizione per cui, se un nuovo ordine viene aperto o un ordine esistente viene chiuso, l'azione viene passata. Cioè dobbiamo confrontare il numero di ordini aperti in precedenza e il numero di modifiche successive, ma non so come scrivere questo nel codice. Come posso salvare i cambiamenti nel numero di ordini? Per favore, aiutatemi.


Proverei a fare questo

//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
int izmb,izms;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(200);

   izmb=0; izms=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(CountOrders(0,0)!=izmb){izmb=CountOrders(0,0);}
   if(CountOrders(0,1)!=izms){izms=CountOrders(0,1);}
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
//|  0 - ордера типа BUY          1 - ордера типа SELL               |
//|  2 - ордера типа BUYLIMIT     3 - ордера типа SELLLIMIT          |
//|  4 - ордера типа BUYSTOP      5 - ордера типа SELLSTOP           |
//|  6 - ордера типа Balance     -1 - Все типы ордеров               |
//+------------------------------------------------------------------+
int CountOrders(string symb="", int or_ty=-1) 
  {
   int cnt=0;
   if(symb=="0") symb=_Symbol;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()==symb || symb=="")
           {
            if(or_ty<0 || or_ty==OrderType()) cnt++;
           }
        }
     }
   return(cnt);
  }
//+------------------------------------------------------------------+
 
Chissà perché il consulente nel tester funziona bene, mette le richieste, ecc, ma nel conto reale, le richieste non sono esposte anche se il robot è attivo
Motivazione: