初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 271

 
soroko:
ので、最初の値だけがインデックス[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:

ありがとう、眠れない週末を過ごさずにすみました)。

vicmos ありがとうございます。
 
barabashkakvn:
vicmos ありがとうございます。
は、ArrayFill(...)/関数のように、すべてを1つの値で埋めます。
 
soroko:
は、ArrayFill(...)/関数のように、すべてを1つの値で埋めます。
桁数が少ないだけで、すみません!ありがとうございました。
 

皆さんこんにちは!そんな問題、コンパイラは警告を出します。無視はしたくないので、出口を探すのを手伝ってくれませんか?

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

特に最後の行に「型変換によるデータ消失の可能性 あり」と書いてあるのが気になる。この場合、実数型を正しく正規化するにはどうしたらよいでしょうか。

 
jommerbot:

皆さんこんにちは!そんな問題、コンパイラは警告を出します。無視はしたくないので、出口を探すのを手伝ってくれませんか?

特に最後の行に「型変換によるデータ消失の可能性 あり」と書いてあるのが気になる。この場合、実数型を正しく正規化するにはどうしたらよいでしょうか。

   dVolatility = NormalizeDouble(dVolatility, (int)SymbolInfoInteger(sSymbol, SYMBOL_DIGITS));
 
barabashkakvn:
ありがとうございました。
 
jommerbot:

皆さんこんにちは!そんな問題、コンパイラは警告を出します。無視はしたくないので、出口を探すのを手伝ってくれませんか?

特に最後の行に「型変換によるデータ消失の可能性 あり」と書いてあるのが気になる。この場合、実数型を正しく正規化するにはどうしたらよいでしょうか。

そしてもう一つ、ArrayMaximum と ArrayMinimum は、見つかった要素のインデックスを返しますだから、正しいやり方はこうだ。

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

また、ArrayMaximum および ArrayMinimum は、見つかった要素のインデックスを返すだから、正しいやり方はこうだ。

ありがとうございました。コードのデバッグ時に同じことを発見。
 

決済した注文の損失額から利食い額を正しく計算しない。1次=1、2次=2、3次=3、4次=4となることがわかった。過去のすべての注文の損失をカバーし、総損失の10%を獲得するためのpips数を計算する必要があります。

実際には、Expert Advisorは、各閉じた注文の量は、本来保留中の注文に 等しいと見なします。つまり、その計算では、保留中の第5の注文が5ロットに等しい場合、以前のすべての負け注文は5ロットに等しく、したがって、損失は対応する間違った利益水準で計算されています。つまり、4つの注文の合計数量が10ロットであれば、Expert Advisorは単純に4つの注文に5番目の保留中の注文の数量を掛けて、合計数量20ロットとします......コードのどこを修正すればいいのでしょうか。

// クローズしたトレードのロス・レベルからテイク・レベルを計算する関数です。

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

double TakeProfitCalculate(double lot,int type)

{

int n,i;

ダブル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)) continue;

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

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

}

理由: