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

 
Andrey Sokolov #:

本当に自分で見ていないのでしょうか?

"どうやって書けばいいの?" - 0.01ロットと書いてあるところは、利用可能な最小値を計算する必要があるんだ。

それはわかります。0.02に設定すると、0.02ロットの注文が選択されます。 最初に0.01ロットをみて、次に0.02をみるというように設定するにはどうしたらいいかと質問しました。

 
Sergey Gridnev #:
1回目で最小ボリュームを求め、2回目でそれを閉じるという2サイクルが必要です。また、クローズ時には注文が1ポジション分ずれるので、最大ポジションから0までのサイクルを行う必要があることに注意しましょう。

最大値から0にする方法は?

 
Rustam Bikbulatov #:

まず0.01、次に0.02と見ていくようにするにはどうしたらいいかということです。

すでに2回、その方法を教えてもらっていますね。

 
Rustam Bikbulatov #:

それはわかります。0.02に設定するとロット0.02の注文が選択されます。 最初に0.01を見て、次に0.02を見て、というように設定する方法をお聞きしたいのです。

2次元配列で収集し、1次元目にはロット、2次元目にはチケットが含まれます。配列をソートし、1次元目のロットが最小になった時点でクローズする。あるいは、全部閉じる必要があっても、ロットが増えてくると最後まで閉じる...。

 
Sergey Gridnev #:
2つのサイクルが必要です。最初のサイクルで最小のボリュームを見つけ、2つ目のサイクルでそれを閉じます。また、クローズ時には注文が1ポジション 分ずれるので、最大ポジションから0までのサイクルを行う必要があることに注意しましょう。

いいえ。初期のものから最新のものまで。

 

と言われているのがわかった。まあ、いつも通り試行錯誤しながら勉強していくしかないですね。

 
Rustam Bikbulatov #:

と言われているのがわかった。まあ、いつも通り試行錯誤しながら勉強していくしかないですね。

//+------------------------------------------------------------------+
//|                                                       Око_01.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#include <GrosBuch.mqh>
#property script_show_inputs

//input double Max_loss=0; //
extern int N=6;           // Количество ордеров
input int SLpips=0;      // Количество пунктов
//Вычисляем возможное оставшееся количество лотов при N лоссов от оставшихся свободных средств
// Buch bi;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double PipValue = MarketInfo(NULL, MODE_TICKVALUE),
          min_lot = MarketInfo(NULL, MODE_MINLOT),
          lot_step = MarketInfo(NULL, MODE_LOTSTEP),
          Margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED),
          Max_loss=N*SLpips*PipValue*min_lot,                 //Вычисляем сумму совокупного возможного лосса
          M_m=DBL_MIN;
   double remains= AccountFreeMargin()-Max_loss;  //Значение свободных средств для открыти ордера Margin*Lots;
   while(remains>Margin*min_lot&&!IsStopped())   //если они больше,чем необходимо для открытия 1 лота
     {
      min_lot=NormalizeDouble(min_lot+lot_step,2);  //добавим минлот
      M_m=Margin*min_lot;                           //получим значени св средств при вычисленном лоте и размере стопа
      // Lots*=min_lot;
      Print("remains = ",remains," Margin =",Margin," PipValue =",PipValue," N =",N,"min_lot =",min_lot," Max_loss =",Max_loss," M-m =",M_m);
     }
  }
//+------------------------------------------------------------------+
 

専門家の皆様、こんばんは。

ひとつだけ理解を深めてください。ある関数の冒頭部分を書いていて、そのコードの一部をスクリプトで確認することにしました。

//+------------------------------------------------------------------+
//|                                                            3.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   /* Создадим запрос на сервер и получим ответ с результатом */
   MqlTradeRequest request= {};
   MqlTradeResult result= {0};
   /* запустим цикл для перебора всех установленных отложенных ордеров */
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      /* определим параметры установленного ордера */
      string symbol=OrderGetString(ORDER_SYMBOL);                        // символ ордера
      int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);        // количество знаков после запятой
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);                // значение одного пункта
      ulong  ticket=OrderGetTicket(i);                                   // тикет ордера
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // тип ордера
      double volume=OrderGetDouble(ORDER_VOLUME_INITIAL);                // объём ордера
      ulong  magic=OrderGetInteger(ORDER_MAGIC);                         // MagicNumber ордера
      double price_current=OrderGetDouble(ORDER_PRICE_CURRENT);          // текущая цена по символу ордера
      double price_order_open=OrderGetDouble(ORDER_PRICE_OPEN);          // цена открытия указанная в ордере
      double sl=OrderGetDouble(ORDER_SL);                                // стоп лосс ордера
      double tp=OrderGetDouble(ORDER_TP);                                // тейк профит ордера
      /* выведем информацию об установленных отложенных ордерах */
      PrintFormat("#%I64u %s  %s  %.2f price_current: %.5f price_order_open: %.5f sl: %.5f tp: %.5f magic: %d",
                  ticket,symbol,EnumToString(type),volume,price_current,price_order_open,sl,tp,magic);
     }
  }
//+------------------------------------------------------------------+


しかし、その結果がExpertsタブに出力されるのは、ちょっと不可解です。保留中の注文ORDER_TYPE_BUY_STOPにはシンボルがあるが、ORDER_TYPE_SELL_STOPには何らかの理由でシンボルがない。

何とつながるのか?ウラジミールさん、ありがとうございます。



 
MrBrooklin #:

専門家の皆様、こんばんは。

ひとつだけ理解を深めてください。ある関数の冒頭部分を書いていて、そのコードの一部をスクリプトで確認することにしました。


しかし、Expertsタブに出力される結果は、ちょっと不可解です。保留中の注文ORDER_TYPE_BUY_STOPにはシンボルがあるが、ORDER_TYPE_SELL_STOPには何らかの理由でシンボルがない。

何とつながるのか?ウラジミールさん、ありがとうございます。



これは、チケットを選択したのではなく、その特性を取得しようとしているためです。
 
Sergey Gridnev #:
チケットを選んでいないのに、その特徴を掴もうとしていることに関係がある。

セルゲイさん、ご回答ありがとうございました。お返事をいただいて、さらに戸惑いました。どうしてだろう?スクリプトを実行すると、設定されたすべての保留中の注文が照会されます。画像で見る限り、チャート上に2枚あり、同時に1枚は選択され、もう1枚は選択されないのですね。よくわからないのです。

もう少し詳しく説明していただけますか?

単なる好奇心ではなく、自習を続けるために質問しています。

ウラジミールさん、ありがとうございます。