初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 112

 
Николай Цепелев:

こんにちは。EAにロットの計算をこのように書きました。

lot=NormalizeDouble(AccountBalance()*risk/(SL*MarketInfo(Symbol(),MODE_TICKVALUE)),2)となります。

目的は、与えられたリスクとストップロスに対して、口座の通貨とペアに関係なく、正しいロットサイズを得ることです。 リスク 、ストップロスが発動されたときの損失額の割合が設定さ れます。ストップロス SL pips単位(ここでpipsはペア価格の可能な限り小さな変化です)このEAを実際の口座で使って みようと思っています。しかし、私は疑問を感じています。どなたか経験豊富なプログラマーの方がいらっしゃいましたら、どのようなエラーが発生するのか教えていただければ幸いです。
まずはストラテジーテスター 続いて、デモ口座です。そして、その時だけ本当のアカウントになる。計算式を確認するために、スクリプトを書きます。あるいは紙に書いて計算すればいい。balance=100, risk=0.1 SL=100, Tick=0.00001 Lot=100*0.1 / (100*0.00001) = 10 / 0.001 = 10000 残高より多いロットをとりました?レバレッジを考慮すべき?
 
STARIJ:
初のストラテジーテスター。次にデモ口座。そして、その時だけ本物を。計算式を確認するためのスクリプトを書く。あるいは紙に書いて計算すればいい。balance=100, risk=0.1 SL=100, Tick=0.00001 Lot=100*0.1 / (100*0.00001) = 10 / 0.001 = 10000 残高より多いロットをとりました?レバレッジを考慮すべき?

MarketInfo(Symbol(),MODE_TICKVALUE)) は最小ティックサイズを返さない。ヘルプに書いてあります。

預け入れ通貨における商品価格の最小変動 幅。


しかし、実際には、1ロットの契約における預託通貨でのシンボル価格の最小変化量の値を返します。


あなたの例では、MarketInfo(Symbol(),MODE_TICKVALUE))は1を返します。 そして、すべてが正しいのですリアルドルとルーブルのアカウントで試したところ、うまくいきました。以下は、それを確認するために使用したスクリプトです。

#property copyright "Copyright 2016, MetaQuotes Software Corp.

#プロパティリンク "https://www.mql5.com"

#property version "1.00"

#プロパティの厳密さ

#property show_inputs

extern double risk=0.10;

extern int sl=1000;

//+------------------------------------------------------------------+

//| スクリプトプログラム起動機能

//+------------------------------------------------------------------+

void OnStart()

{

アラート(NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE),2))。

}

//+------------------------------------------------------------------+

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Библиотеки: Black or White Text Black or White Text...
 

おっしゃるとおりです。スクリプトによるチェックは、より速く、より確実です

//+------------------------------------------------------------------+ 
//| Расчет лота                                                      | 
//+------------------------------------------------------------------+ 
#property strict
#property show_inputs
extern double risk=0.10;
extern int    sl  =100;
void OnStart() 
{ 
   Alert(MarketInfo(Symbol(),MODE_TICKVALUE), "   ",NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE)),2));
}
 
Николай Цепелев:
あなたのスクリプトは画面上で19cmの高さを占めていますが、私のスクリプトは8.1cmで、半分の高さです。そして、色も違う
 

また、NormaliseDouble関数の精度を最小許容ロットに依存させる必要があります。OrderSend関数に 0.11のようなロットを渡した場合、ツールが0.1の倍数のロットでしか取引されていない場合、エラーが発生します。

 

オープントレードが一度に削除されない、つまりEAが一部を削除しても、error orderdelete 4108, market order cannot be deleted several times, and only then deletions.なぜ、オープントレードが一度に削除されないのか理解できない。

  int start()                                     
  {
  
  while(!IsStopped())     
      {               

Refreshrates();

  
   if(cont==true&&NormalizeDouble(AccountProfit(),2)>=0)
    {
     for(i=1; i<=OrdersTotal(); i++)       
        { RefreshRates(); 
         if(OrderSelect(i-1,SELECT_BY_POS)==true
           {                                    
              while(OrderType()==OP_BUYLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
               }
              while(OrderType()==OP_BUY)
              {
               res=false;
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_BID),Slippage);  
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELLLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELL)
              {
               res=false;     
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_ASK),Slippage);
               if(res==true)
               break;
              }     
           }  
         }
}
}  
 
Yevgen Butov:

オープントレードが一度に削除されない、つまりEAが一部を削除しても、error orderdelete 4108, market order cannot be deleted several times, and only then deletions.なぜ、オープントレードが一度に削除されないのか理解できない。

このページでは、削除の方法について説明します。2つのエラーがあります。

 
こんにちは。助けてくださいということです。NETとフォーラムを検索してみました。Expert Advisorを標準モードでテストしていますが、すべてOKです...。エラーや警告はありません。ティックデータをダウンロードし、追加しました。(私はここで説明されているようにすべてを行いました - 99%の品質でExpert Advisorをテストする方法 - 簡単、無料、合法)メタトレーダー4ストラテジーテスターで 99%のシミュレーション品質を得る方法" をご覧ください。)起動時に「'expert1.0.mq4'(69,25)の配列が範囲外です」というエラーが常に発生します。配列のことだと理解しています。どうしたらいいんだろう。でも、標準モードではすべてOKなので...。よろしくお願いします。
 
qroner:
起動時に 'expert1.0.mq4' (69,25) でarray out of range という定数エラーが発生します。配列のことだと理解しました。どうしたらいいんだろう。

この配列を処理するコード、またはその一部を見る必要があります。

テレパスの皆さん、今日はゆっくり休んでください。

 
Konstantin Nikitin:

配列を処理するコードまたはその一部を見る必要があります。

テレパスの皆さん、今日はゆっくり休んでください。

void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8]){。
ArrayInitialize(_Mas, 0)とする。
int Ticket=-1;
for(int pos=OrdersTotal()-1; pos>=0; pos--){。
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol&&&)
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket){ オーダーマジック番号()==_Magic && オーダーチケット()===Ticket
Ticket=OrderTicket()です。
switch(OrderType()の場合){。
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}

}

これがその機能です。

ただ、標準モードではエラーが出ないので、問題はコードにないのではと思いました。