Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 271

 
soroko:
so dass nur der erste Wert mit dem Index [0] ausgefüllt wird.
//+------------------------------------------------------------------+
//|                                                         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:

Danke. Das hat mir ein schlafloses Wochenende erspart).

vicmos danke.
 
barabashkakvn:
vicmos danke.
sie füllt alles mit einem Wert, wie die Funktion ArrayFill(...)/
 
soroko:
sie füllt alles mit einem Wert, wie die Funktion ArrayFill(...)/
Entschuldigung, es gibt nur eine kleinere Anzahl von Ziffern! Vielen Dank!
 

Guten Tag an alle! Ein solches Problem - der Compiler gibt eine Warnung aus. Ich will es nicht ignorieren, können Sie mir helfen, einen Ausweg zu finden?

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

Er flucht insbesondere in der letzten Zeile, in der es heißt:"möglicher Datenverlust aufgrund der Typkonvertierung". Wie lässt sich der reale Typ in diesem Fall korrekt normalisieren?

 
jommerbot:

Guten Tag an alle! Ein solches Problem - der Compiler gibt eine Warnung aus. Ich will es nicht ignorieren, können Sie mir helfen, einen Ausweg zu finden?

Er flucht insbesondere in der letzten Zeile, in der es heißt:"möglicher Datenverlust aufgrund der Typkonvertierung". Wie lässt sich der reale Typ in diesem Fall korrekt normalisieren?

   dVolatility = NormalizeDouble(dVolatility, (int)SymbolInfoInteger(sSymbol, SYMBOL_DIGITS));
 
barabashkakvn:
Dankeschön
 
jommerbot:

Guten Tag zusammen, das ist ein Problem - der Compiler gibt eine Warnung aus. Ich möchte es nicht ignorieren, können Sie mir helfen, einen Ausweg zu finden?

Insbesondere in der letzten Zeile wird geflucht:"möglicher Datenverlust aufgrund der Typkonvertierung". Wie lässt sich der reale Typ in diesem Fall korrekt normalisieren?

Und noch etwas: ArrayMaximum und ArrayMinimum geben den Index des gefundenen Elements zurück. Der richtige Weg ist also dieser:

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

Außerdem: ArrayMaximum und ArrayMinimum geben den Index des gefundenen Elements zurück. Der richtige Weg ist also der folgende:

Ich danke Ihnen vielmals. Beim Debuggen des Codes habe ich das Gleiche entdeckt.
 

Es berechnet die Gewinnmitnahme nicht korrekt auf der Grundlage der Höhe der Verluste der geschlossenen Aufträge. Es stellt sich heraus, dass die 1. Ordnung = 1; 2. Ordnung = 2; 3. Ordnung = 3; 4. Wir müssen die Anzahl der Pips berechnen, um den Verlust aller vorherigen Aufträge zu decken und 10 % des Gesamtverlustes zu gewinnen.

Tatsächlich betrachtet der Expert Advisor den Betrag jeder geschlossenen Order als gleichwertig mit der vermeintlich ausstehenden Order, d.h. seine Berechnungen zeigen, dass, wenn die ausstehende fünfte Order 5 Lots beträgt, alle vorherigen Verlust-Orders gleich 5 Lots waren, und daher wird der Verlust mit dem entsprechenden falschen Gewinnniveau berechnet. Mit anderen Worten, wenn das Gesamtvolumen von 4 Aufträgen 10 Lots beträgt, dann wird der Expert Advisor einfach 4 Aufträge mit dem Volumen des 5. ausstehenden Auftrags multiplizieren und ein Gesamtvolumen von 20 Lots erhalten......Was sollten wir im Code korrigieren?

// Funktion zur Berechnung des Take Levels basierend auf dem Loss Level der abgeschlossenen Trades

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

double TakeProfitCalculate(double lot,int type)

{

int n,i;

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

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

n=OrderMagicNumber()-MAGIC;

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

if(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))

}

Grund der Beschwerde: