Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 271

 
soroko:
quindi solo il primo valore viene riempito con l'indice [0].
//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2014, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"

double Pr[5];                 // обявление 5-мерного статического массива
double PriceOld;              // переменная для сравнения цены
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double temp_prace=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if(NormalizeDouble(PriceOld-temp_prace,5)!=0)
     {
      Pr[4]=Pr[3];
      Pr[3]=Pr[2];
      Pr[2]=Pr[1];
      Pr[1]=Pr[0];
      Pr[0]=temp_prace;
      PriceOld=Pr[0];
     }
  }
//+------------------------------------------------------------------+
 
soroko:

grazie. mi ha risparmiato un fine settimana insonne).

vicmos grazie.
 
barabashkakvn:
vicmos grazie.
riempie tutto con un valore, come la funzione ArrayFill(...)/
 
soroko:
riempie tutto con un valore, come la funzione ArrayFill(...)/
scusate c'è solo un numero minore di cifre! grazie mille!
 

Buona giornata a tutti! Un tale problema - il compilatore dà un avvertimento. Non voglio ignorarlo, potete aiutarmi a trovare una via d'uscita?

   double aHigh[ 12 ], aLow[ 12 ];
   double dVolatility = 0.0;
   
   CopyHigh(sSymbol, PERIOD_MN1, 0, 12, aHigh);
   CopyLow(sSymbol, PERIOD_MN1, 0, 12, aLow);
   
   dVolatility = ArrayMaximum(aHigh) - ArrayMinimum(aLow);
   dVolatility = NormalizeDouble(dVolatility, SymbolInfoInteger(sSymbol, SYMBOL_DIGITS));

Sta maledicendo in particolare l'ultima riga, dice:"possibile perdita di dati a causa della conversione del tipo". Come normalizzare correttamente il tipo reale in questo caso?

 
jommerbot:

Buona giornata a tutti! Un tale problema - il compilatore dà un avvertimento. Non voglio ignorarlo, potete aiutarmi a trovare una via d'uscita?

Sta maledicendo in particolare l'ultima riga, dice:"possibile perdita di dati a causa della conversione del tipo". Come normalizzare correttamente il tipo reale in questo caso?

   dVolatility = NormalizeDouble(dVolatility, (int)SymbolInfoInteger(sSymbol, SYMBOL_DIGITS));
 
barabashkakvn:
Grazie
 
jommerbot:

Buona giornata a tutti! Un tale problema - il compilatore dà un avvertimento. Non voglio ignorarlo, potete aiutarmi a trovare una via d'uscita?

Sta maledicendo in particolare l'ultima riga, dice:"possibile perdita di dati a causa della conversione del tipo". Come normalizzare correttamente il tipo reale in questo caso?

E un'altra cosa: ArrayMaximum e ArrayMinimum restituiscono l'indice dell'elemento trovato. Quindi il modo corretto è questo:

   dVolatility = aHigh[ArrayMaximum(aHigh)] - aLow[ArrayMinimum(aLow)];
 
MigVRN:

Inoltre: ArrayMaximum e ArrayMinimum restituisce l'indice dell'elemento trovato. Quindi il modo corretto è questo:

Grazie mille. Ho scoperto la stessa cosa durante il debug del codice.
 

Non calcola correttamente il livello di take profit in base all'ammontare delle perdite degli ordini chiusi. Risulta che il 1° ordine = 1; 2° ordine = 2; 3° ordine = 3; 4° ordine = 4. Dobbiamo calcolare il numero di pip per coprire la perdita su tutti gli ordini precedenti e guadagnare il 10% della perdita totale.

In realtà, l'Expert Advisor considera semplicemente che l'importo di ogni ordine chiuso sia uguale all'ordine presumibilmente pendente, cioè i suoi calcoli mostrano che se l'ordine pendente 5 è uguale a 5 lotti, tutti gli ordini precedenti perdenti erano uguali a 5 lotti e, quindi, la perdita viene calcolata con il corrispondente livello di profitto sbagliato. In altre parole, se il volume totale di 4 ordini è uguale a 10 lotti, allora l'Expert Advisor moltiplicherà semplicemente 4 ordini per il volume del quinto ordine in sospeso e otterrà un volume totale di 20 lotti......Cosa dobbiamo correggere nel codice?

// Funzione che calcola il Take Level in base al Loss Level dei trade chiusi

//=================================================================================================

double TakeProfitCalculate(double lot,int type)

{

int n,i;

doppio prf,ttp;


prf=MathAbs(BuyLevel-SellLevel)/Point*LOT*MarketInfo(Symbol(),MODE_TICKVALUE);//

if(No!=0) for(i=OrdersHistoryTotal()-1;i>=0;i--)

{

if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continua;

if(OrderSymbol()!=Symbol() || OrderMagicNumber()<MAGIC || OrderMagicNumber()>MAGIC+200 || OrderType()>OP_SELL) continua;

n=OrderMagicNumber()-MAGIC;

prf+=(OrderProfit()+OrderSwap()+OrderCommission());

se(n==0) break;

}

prf=MathAbs(prf*(100+ProfitPercent)/100);

ttp=prf*Point/(LOT*MarketInfo(Symbol(),MODE_TICKVALUE))

if(type==OP_BUY) return(NRu(BuyLevel+ttp)); else return(NRd(SellLevel-ttp))

}