mql5言語の特徴、微妙なニュアンスとテクニック - ページ 173

 
fxsaber:

上記を更新しました。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

mql5の特性、ヒントとコツ

fxsaber, 2020.04.09 13:13

全く遭遇していないようですね。ドキュメンテーションをご覧ください。1回のご注文で2巻までとなります。

これらはライブリミッターです。1番目の数字は元の容量、2番目の数字は注ぎ足した容量です。イコールになったり、削除されたりするとすぐに履歴に残ります。


1つの注文を2つに分けて実行するのでは?未実行ボリュームが同じなのはおかしいと思います。

 
Alexey Viktorov:

1つの注文を2つに分けて実行するのでは?未実行ボリュームが同じなのはおかしいと思います。

偶然の一致。マグカップも違うんですよ。

 
fxsaber:

生きている時のオーダーモードには秩序がありえません。死んだら......元々言われているように、最初の処刑の時期があります。


歴史に発見。

 
fxsaber:

CloseByで折りたたむと、マジコンが無くなるようです。チェックが必要です。

これが、以下の最初のコードが動作しない原因のようです。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

MQL5でヒストリープロフィット?

fxsaber さん 2017.08.26 19:16

  1. MQL5
    double Profit( void )
    {
     double Res = 0;
    
     if (HistorySelect(0, INT_MAX))
       for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
       {
         const ulong Ticket = HistoryDealGetTicket(i);
         
         if((HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) && (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symbol()))
           Res += HistoryDealGetDouble(Ticket, DEAL_PROFIT);
       }
         
      return(Res);
    }


  2. MQL5 + MQL4
    #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
    
    double Profit( void )
    {
     double Res = 0;
    
     for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
       if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderMagicNumber() == MagicNumber) && (OrderSymbol() == Symbol()))
         Res += OrderProfit();
         
      return(Res);
    }

マジックで利益を数えるのは問題なさそうです。

 
注文価格は正規化されているが、取引は正規化されていない。そんなお得な情報をスクリプトが見つけてくれる。
void OnStart()
{
  if (HistorySelect(0, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--) // Перебираем все сделки
    {
      const ulong Ticket = HistoryDealGetTicket(i); // Тикет сделки
      const double Price = HistoryDealGetDouble(Ticket, DEAL_PRICE); // Цена сделки
      
      if (NormalizeDouble(Price, 5) != Price) // Если цена сделки не нормализована,      
        Print(Ticket);                        // печатаем тикет сделки.
    }
}
 

MT5がリアルタイムで自動的に配置するポジションのオープン/クローズの矢印は、TradeTransaction-eventsをベースにしています。


たった今、これらのイベント(十数ポジションの開閉)が、一瞬の接続障害でターミナルに届かなかったのを確認しました。あまりの偶然に、PCに向かっていて、目で見て確認しました。そのため、対応する矢印はありません。


また、ここで時々言われているように、戦闘用EAではOnTradeTransactionは 当てになりません。OrderSendAsyncを扱うための信頼できるパブリックなメカニズムがないのは残念です。

 
fxsaber:

OrderSendAsyncを扱うための信頼できるパブリックなメカニズムがないのは残念です。

サービスはトレードに アクセスできるのか?- であれば、10msごとに監視し、イベントをチャートに送ることが可能です

ヘルプを見て、サービスが追加されたのかなと思ったのですが、去年もこんな感じだったような気がします。

-指標、Expert Advisor、スクリプトとは対照的に、チャートにバインドする必要のないプログラムです。スクリプトと同様、サービスは起動イベント以外のイベントを処理しない。サービスを開始するには、そのコードにOnStartハンドラ関数が含まれている必要があります。サービスは Start 以外のイベントを受け付けませんが、EventChartCustom を使用してチャート自体にカスタム イベントを送信することができます。

UPD:サービススクリプトを書き上げました。

struct SOrderInfo
{
   int positionstotal;
   int orderstotal;
   int historyorderstotal;
   bool operator==(const SOrderInfo &v){return(positionstotal==v.positionstotal && orderstotal==v.orderstotal && historyorderstotal==v.historyorderstotal);}
};
//+------------------------------------------------------------------+
int OnStart()
{
   SOrderInfo CurrState = UpdateOrdersInfo();
   SOrderInfo LastState = CurrState;
   while(!IsStopped())
   {
      Sleep(10);
      CurrState = UpdateOrdersInfo();
      if(CurrState == LastState) continue;
      LastState = CurrState;
      Print("Orders changed!");
   }
   return(0);
}
//+------------------------------------------------------------------+
SOrderInfo UpdateOrdersInfo()
{
   SOrderInfo result;
   result.positionstotal     = PositionsTotal();
   result.orderstotal        = OrdersTotal();
   result.historyorderstotal = HistoryOrdersTotal();
   return(result);
}
//+------------------------------------------------------------------+

いくつかの注文を開き、手動で閉じた。

 
Igor Makanu:

サービスはトレードに アクセスできるのか?- であれば、10msごとに監視して、チャートにイベントを送ることが可能です。

これは、ソウトロニックでの同じオーバーランと何ら変わりません。ただ、カウントの比較だけでは不十分で、内部が変わっている可能性があります。

 
Andrey Khatimlianskii:

オウレットニクの同じやりすぎと変わらない。ただ、量を比較するだけではダメで、内部が変わることもある。

Alertersのようなサービスは非常に良いですね。チャートは必要ありません、Terminalで自動的に起動します。アカウント間の切り替えのシチュエーションを工夫すればいいのです。

サービスはコンバットアドバイザーになることも可能です。GUIがないと、どうしても不便なんです。
 
Andrey Khatimlianskii:

オウレットニクの同じやりすぎと変わらない。ただ、量を比較するだけではダメで、内部が変わることもある。

が違います。

いわゆる制御・管理業務があります

EA-マネジメント、サービス-コントロール

コントロールは余計なものであってはならない - システムのすべてのリソースを取ってしまい、コントロールの代わりに不安定なシステムを得ることになります。

イベントの重要性を定義する必要があります。例えば、注文のクローズとオープニングは制御が必要な重要なイベントですが、TPとSLの変更は以前と同様に行うことができます(数回の失敗があっても、次のティックで再挑戦するため、そのままにしておきます)。

で、ご指摘の、すべてをコントロールする方法は、SQLiteで注文の状態を繰り返すことが可能ですが、その場合、サービスやEAとデータベースの同期の問題が発生します...。余計なお世話


EAのターミナルからOnTradeTransaction イベントを取得し、EAでの追加制御のためにサービスからOnChartEventイベントを生成する、というようなシンプルな仕組みにすべきと思います。

理由: