偉大で恐ろしいMT4の永遠(または移行の戦略方法) - ページ 16

 

というのがうまくいくんですよね〜(目的によっては!?)

#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int total=PositionsTotal();
   int Ordertotal=OrdersTotal();
   while(!IsStopped() && (total <= 1))  // Закончим, когда появится более одной позиции.
      if(total == 1)
         Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      else
         if(Ordertotal!=0)
            Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+
 
SanAlex:

というのは、うまくいくんですよね〜(目的によっては!?)

巻き込まれないように。そこには特別なDCがいて、MTの虫を捕まえるためにいろいろな陰謀を企んでいるのです。

 
Alexey Viktorov:

MTバグを捕まえるために、様々な陰謀を構築する特殊DC。

ほとんどのブローカーは同じ方式で動いています:Result.deal == 0.

例えば、スキャルピングで最も人気のあるブローカーは「Signals」です。

評判の良いブローカーの中で、MT5が別の方式で動作するところを見つけるのは非常に困難です。

 
SanAlex:

というのがうまくいくんですよね〜(目的によっては!?)


具体的にどのような点が「うまくいく」のでしょうか?
あなたのコードに誤りがあり、それはすでに上で指摘されています。
 
fxsaber:

ほとんどのブローカーは同じ方式で動いている:Result.deal == 0.

例えばシグナルズは、スキャルピングで最も人気のあるブローカーです。

有名なブローカーの中で、MT5が別の方式で動作するところを見つけるのは非常に困難です。

ポジションを閉じる暇もないほど動くスキャルピングってなんなんだろう・・・。

それでもよければ、ポジション数の チェックを追加してみてください。

    else if(!PositionsTotal() && !OrdersTotal())

2つのポジションはオープン&クローズだと思います。この2つのポジションのタイプを試してみて損はないだろう。もし向きが違っていたら、私の疑惑を裏付けることになるのですが...。

 
Ihor Herasko:

完了しました。

結果

このチケットのステータスを知ることができます。

取引は失敗し、約定価格は0円です。

取引依頼結果(MqlTradeResult)の構造体

取引サーバは、取引要求に対して、取引要求処理結果を含むデータを、予め定義された特殊な構造体MqlTradeResultとして返します。

struct MqlTradeResult
  {
   uint     retcode;          // Код результата операции
   ulong    deal;             // Тикет сделки, если она совершена
   ulong    order;            // Тикет ордера, если он выставлен
   double   volume;           // Объем сделки, подтверждённый брокером
   double   price;            // Цена в сделке, подтверждённая брокером
   double   bid;              // Текущая рыночная цена предложения (цены реквота)
   double   ask;              // Текущая рыночная цена спроса (цены реквота)
   string   comment;          // Комментарий брокера к операции (по умолчанию заполняется расшифровкой кода возврата торгового сервера)
   uint     request_id;       // Идентификатор запроса, устанавливается терминалом при отправке 
   uint     retcode_external; // Код ответа внешней торговой системы
  };

 
Rashid Umarov:

だから、この注文のステータスを取得します。 チケットがわかっている場合。

取引は失敗し、約定価格は0円です。

それは、「過ぎてしまった」ということです。スクリプトの実行が終了すると、1つまたは2つの位置がぶら下がったままになります(コードに挿入するプリントの数によって異なります)。

コード

#define  PRINT(A) Print(#A + " = " + (string)(A))

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
    {
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      Print("Закрытие, т. к. PositionsTotal() равно 1");
    }
    else if (!OrdersTotal())
    {
      printf("Перед открытием. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
      PRINT(Trade.ResultRetcodeDescription());
      PRINT(Trade.ResultDeal());
      PRINT(Trade.ResultOrder());
      PRINT(Trade.ResultComment());
      if (OrderSelect(Trade.ResultOrder()))
         PRINT(OrderGetInteger(ORDER_STATE));
      printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
    }
    
  Print("Выход. PostionsTotal: ", PositionsTotal());
}

結果

2021.05.05 14:25:14.738 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultRetcodeDescription() = done at 0.00000
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultDeal() = 0
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultOrder() = 2249888681
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultComment() = Request executed
2021.05.05 14:25:14.821 Test (EURUSD,M1)        EnumToString(ENUM_ORDER_STATE(OrderGetInteger(ORDER_STATE))) = ORDER_STATE_PLACED
2021.05.05 14:25:14.821 Test (EURUSD,M1)        После открытия. PositionsTotal: 1, OrdersTotal: 1
2021.05.05 14:25:14.899 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 14:25:14.899 Test (EURUSD,M1)        Выход. PostionsTotal: 2
 
Alexey Viktorov:

ポジションの決済が間に合わないほど動くスキャルピングってなんなんだろう......。

そこでは、すべてが時間軸上にある。MT5のアーキテクチャ上の機能です。

もし差し支えなければ、ポジション数の チェックを追加してみてください。

このチェックはソースコードに存在する。

2つのポジションはオープン&クローズ だと思います。この2つのポジションのタイプを試してみても損はないだろう。もし向きが違っていたら、私の疑惑を裏付けることになるのですが...。

クロージングポジションというものは存在しない。

 
fxsaber:

まだ投稿できていないんです。24時間以内に掲載します。

うまくいかなかった、問題が見つかった。

 
fxsaber:

うまくいかなかった、問題が見つかった。

楽しみにしています。何かありましたら、お書きください。