MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 565

削除済み  
PolarSeaman:

コードで代用したのは

まで

が、役に立たなかった)

それしか気づかなかったのは残念です)

削除済み  
Alekseu Fedotov:

SEEK_ENDフラグ付きのFileSeek()を使用すると便利です。

<

ありがとうございます! 試してみます。

 
YanSay:

こんばんは!(^o^)

保証金の割合に基づいて取引のロットを計算するための普遍的な(異なる商品用の)コードを追加する方法に困惑しています。

こんな感じで作りました。

プライス(始 値)とSL(ストップロス)は別々に計算されます。

クォート通貨がドルであるペア(例:EURUSD)、インデックスSPX500および金については、すべて正しく計算されますが、ドルがクォートの最初のペア(例:USDJPY)については動作しません。

私が見逃しているものをアドバイスしてください。

ノーマライゼーションに注目

Digits変数には、現在のチャートシンボルの価格精度を決定する小数点以下の桁数が格納されます。

 
Alekseu Fedotov:

正規化に注意

変数_Digitsには、現在のチャートシンボル価格の精度を決定する小数点以下の桁数が格納されます。

ありがとうございました。ここでは、そのやり直しの様子を紹介します。

input double MaximumRisk=0.02;                  //Риск в сделке от депозита

//1ый вариант
{Lots = NormalizeDouble(((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_LOTSIZE)*(MarketInfo(Symbol(),MODE_ASK)+Point))
-(MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo(Symbol(),MODE_ASK)))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

//2ой вариант
{Lots = NormalizeDouble((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_TICKVALUE))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

最初のバリエーションでは:EURUSDとXAUUSD - すべてが正しい、USDJPY - 預金額の2%の代わりに0.2%のリスクがある、SPX500とBRNの場合、OrderSend エラー131(ロット計算のエラー)が発生しました。

2番目のケース:EURUSD、XAUSD、USDJPY - すべてが正しい。SPX500は、2%ではなく、預金の20%をリスクとし、BRNについては、OrderSendエラー131(ロット計算のエラー)が発生します。

他の場所でエラーが発生しているのですが、どの場所なのかがわかりません。

 
YanSay:

ありがとうございました。ここでは、そのやり直しを紹介します。

最初のバージョン:EURUSDとXAUSD - すべてが正しい。USDJPY - 預金額の2%ではなく、0,2%のリスクがある。SPX500とBRNのケースでは、OrderSendエラー131(ロット計算のエラー)まで表示されます。

2番目のバリエーション:EURUSD、XAUSD、USDJPY - すべてが正しい。SPX500は、2%ではなく、預金の20%をリスクにさらす。

どこかがエラーになっているのですが、どの場所かわかりませんので、アドバイスをお願いします。

Point をMarketInfo(Symbol(),MODE_POINT) 置き換える

 
Vitaly Muzichenko:

Point をMarketInfo(Symbol(),MODE_POINT) 置き換える

何が言いたいのか?すべてがチャート記号で計算される場合。多変量で現在のチャートと異なるシンボルが 計算されている場合は意味があります。

 
Vitaly Muzichenko:

Point をMarketInfo(Symbol(),MODE_POINT) 置き換える

残念ながら、役に立ちませんでした(

MODE_POINT情報には、「引用通貨でのポイントサイズ」とあります。現在のシンボルに対する定義済み変数 Pointに格納される"。

説明から判断すると、どのバリアントを使っても問題ないでしょう。しかし、試してみたが、効果はなかった。


 

Expert Advisorのボタンにグラフィカルツールの「選択」を入れて、ボタンをクリックするとカーソルの下にツールアイコンが表示され、それを伸ばすことが可能かどうか教えてください。

そして、チャンネルはすでに指定されたプロパティを持っているはずです

 
Roman Sharanov:

Expert Advisorのボタンにグラフィカルツールの「選択」を入れて、ボタンをクリックするとカーソルの下にツールアイコンが表示され、それを伸ばすことが可能かどうか教えてください。

また、チャンネルはすでに指定されたプロパティを持つことができます。

もしかしたら

 
YanSay:

残念ながら役に立ちませんでした(

そして、MODE_POINTの情報には、「引用通貨でのポイントサイズ」と書かれています。現在のシンボルについては、あらかじめ定義された変数「Point」に格納されます。

説明から判断すると、どのバリアントを使っても問題ないでしょう。しかし、試してみたが、効果はなかった。

機能をお試しください。

//===============================================================================================
//------------------------------ Расчет лота по риску на StopLoss -------------------------------+
//===============================================================================================
double sLot(double Percent=1, double Stloss=100, string symb="0") {
 if(symb=="0") symb=Symbol();
 double TickValue   =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_VALUE),
        TickSize    =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_SIZE),
        ContractSize=SymbolInfoDouble(symb,SYMBOL_TRADE_CONTRACT_SIZE),
        Min_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MIN),
        Max_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MAX),
        Step        =SymbolInfoDouble(symb,SYMBOL_VOLUME_STEP),
        Free        =AccountInfoDouble(ACCOUNT_FREEMARGIN),
        Lots_New    =0.0;
 int CalcMode=(int)SymbolInfoInteger(symb,SYMBOL_TRADE_CALC_MODE);

  if(Percent > 100) Percent = 100;
  if(Stloss <=0) return(0);
  if(Percent == 0) Lots_New = Min_Lot;
   else {
    if(CalcMode==0 || CalcMode==4)
      Lots_New = MathFloor((((Free*Percent/100)/Stloss)/TickValue)/Step)*Step;
    if(CalcMode==1||CalcMode==2||CalcMode==3)
      Lots_New = MathFloor(((((Free*Percent)/100)/Stloss)/((TickSize*TickValue)*ContractSize/TickValue))/Step)*Step;
   }
   if(Lots_New > Max_Lot) Lots_New = Max_Lot;
   if(Lots_New < Min_Lot) return(0);
  return(NormalizeDouble(Lots_New,/*LotDigit()*/ 2));
 }