オーダーを探すという作業 - ページ 3

 
Игорь Герасько:

さまざまな「グリッド」を実装していく中で、このような構造を思いつきました。

この構造は、マジックナンバーの値に基づいて、新しいティックごとに埋められます(注文番号、どのグリッドに属するかなど、注文を識別するために必要なすべての情報が格納されています)。

これは、私が考え出したコードです。

class Info
  {
private:
   struct str
     {
      string            Sym;                                // Символ ордера
      string            Com;                                // Коммент ордера
      int               Tic;                                // Тиккет ордера
      int               Typ;                                // Тип ордера
      int               Mag;                                // Меджик номер ордера
      double            Lot;                                // Лот ордера
      double            Pri;                                // Цена открытия ордера
      double            SL_;                                // Стоп лосс ордера
      double            TP_;                                // Тейк профит ордера
      datetime          Tim;                                // Время открытия ордера
      double            Pro;                                // Профит ордера
     };
   int               m_tick_upper;                          // Тиккет максимального по цене ордера
   int               m_tick_upper_;                         // Тиккет предпоследнего максимального по цене ордера
   int               m_tick_lower;                          // Тиккет минимального по цене ордера
   int               m_tick_lower_;                         // Тиккет предпоследнего минимального по цене оредра

   int               m_tick_start;                          // Тиккет первого по времени ордера
   int               m_tick_start_;                         // Тиккет вторго по времени ордера
   int               m_tick_end;                            // Тиккет последнего по времени ордера
   int               m_tick_end_;                           // Тиккет предпоследнего по времени ордера

   int               m_magic;                               // Меджик номер
   string            m_symbol;                              // Символ ордера

   void              SearchTicketPriceType(const int type); // Поиск по цене
   void              SearchTicketTimeType(const int type);  // Поиск по времени

public:

   str               Price_Max;                             // Структура запроса максимальных ценн
   str               Price_Min;                             // Структура запроса минимальных  ценн
   str               Time_End;                              // Структура последних ордеров
   str               Time_Start;                            // Структура начальных ордеров

   str               Price_Max2;                            // Структура запроса максимальных ценн
   str               Price_Min2;                            // Структура запроса минимальных  ценн
   str               Time_End2;                             // Структура последних ордеров
   str               Time_Start2;                           // Структура начальных ордеров

   void              SetMagic (const int    mag) { m_magic  = mag; } // Принудительное указание меджик номера
   void              SetSymbol(const string sym) { m_symbol = sym; } // Принудительное указание символа

   void              SearchTimeOrder(const int type);       // Заполнение структуры по времени      
   void              SearchPriceOrder(const int type);      // Заполнение структуры по ценам 

                     Info(const string sym,const int mag);  // Параметрический конструктор
                     Info(){};
                    ~Info(){};
  };
 
Михаил:
...

"ところで - Windowsがダウンしている場合、EAは注文を削除することもできません - ここでは手動のみなので、この例は自動売買に完全に適用することはできません。"

可能ですが、おそらく方法を知らないでしょう。もし興味があれば、コードを掲載することができます。

なーんだ、コードはいらないんだ。アルゴリズムの概要ですが、もしよろしければ...クラッシュしたOSで動作するターミナルでEAを 動かす方法が本当にわからないのですが
 
Artyom Trishkin:
いいえ、コードは必要ありません。アルゴリズムを一言で言うと...クラッシュしたOSで動作するターミナルでEAを 動かす方法が本当にわからないのですが

説明するより、コードを並べる方が簡単ですからね。

//+------------------------------------------------------------------+
//| Expert Remove orders function                                    |
//+------------------------------------------------------------------+
void RemoveOrders()
{
  int orders_total = OrdersTotal();
//---  
  if ( orders_total > 0 )
  {
    for ( int i = 0; i < orders_total; i++ )
    {
      ulong temp_order_ticket = OrderGetTicket( i );
      
      if ( OrderSelect( temp_order_ticket ) )
      {
        string temp_symbol = OrderGetString( ORDER_SYMBOL );
        
        if ( temp_symbol == _Symbol )
        {
          RemoveOldOrder( temp_symbol, temp_order_ticket );
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Expert remove old order function                                 |
//+------------------------------------------------------------------+
void RemoveOldOrder( const string symbol, const ulong ord_ticket )
{
  MqlTradeRequest request = {0};
  MqlTradeResult  result  = {0};
  
  request.action = TRADE_ACTION_REMOVE;
  request.order  = ord_ticket;
  
   if ( OrderSend( request, result ) )
   {
     if ( result.retcode == TRADE_RETCODE_PLACED )
     { 
//        SetTransCount( true );
     }
  }
  else
  {
    Print( "Удаление старого ордера не выполнено! Билет = ", ord_ticket);
  }
}
 
Vladimir Pastushak:

これは、私が考え出したコードです。

くそ、○○はふざけんなよ。現在の環境から国家を回復させるべきであり、MTが与えてくれるものは最も信頼できる選択肢である、という方向性をあなた自身が定義したのです。その代わりに、長くて役に立たないクラスInfoを書き、そこに外部関数が見つけた値をどうにか詰め込まなければならないのです。そうですね、最終的には必要な変数が含まれるようになります。注文の価格に関する最大と最小のチケットや、その他の重要なものが含まれます。例えば、注文のリストがあり、各注文は多くの列(注文ID、開始時間、開始価格、利益など)を持つテーブル行を表しているとします。列の一つでソートすると、まさに必要な配列が得られるのです。つまり、このようなことは、あなたが好きなクラスの助けを借りて行うことができるのです(無知ですが、すみません)。明日、やり方を書きますので、興味のある方はどうぞ。
 
Vasiliy Sokolov:
くそ、○○はふざけんなよ。あなた自身が正しい方向を定義している。現在の環境から状態を回復すべきであり、MTが与えてくれるものは最も信頼できるオプションである。その代わりに、長くて役に立たないクラスInfoを書き、そこに外部関数が見つけた値をどうにか詰め込まなければならないのです。そうですね、最終的には必要な変数が含まれるようになります。注文の価格に関する最大と最小のチケットや、その他の重要なものが含まれます。例えば、注文のリストがあり、各注文は多くの列(注文ID、開始時間、開始価格、利益など)を持つテーブル行を表しているとします。列の一つでソートすると、まさに必要な配列が得られるのです。つまり、このようなことは、あなたが好きなクラスの助けを借りて行うことができるのです(無知ですが、すみません)。どうすればいいのか......明日書きますので、ご興味のある方はどうぞ。

非常に楽しみです...。

情報が必要なのは、情報のためではなく、さらに加工したり計算したりするためだ.

 
Михаил:

説明するより、コードを掲載する方が簡単ですからね。

壊れたパソコンでどうやって使うんだ?(機能的には全く不思議はない)。

だから私は、「コードはいらない」と言ったのです。動かないコンピュータで動くアルゴリズムが欲しい(軸が壊れている、引用を思い出してください。クラッシュしたOS上で動いているターミナルでExpert Advisorを動かす方法が 本当にわからない」「VPSとかいらないから、Expert Advisorが動いているターミナルがあるパソコン、サーバーなどのOSがクラッシュしていると考えて、そこにあなたのコードを湿布して...」。 )。

 
Artyom Trishkin:

壊れたパソコンでどうやって使うんだ?(機能的には全く不思議はない)。

だから私は、「コードはいらない」と言ったのです。動かないコンピュータで動くアルゴリズムが必要なんです(OSがダウンしているので、思い出してください-と引用しています)。クラッシュしたOS上で動いているターミナルでExpert Advisorを動かす方法が 本当にわからない」「VPSとかはいらないから、Expert Advisorが動いているターミナルがあるパソコンやサーバーなどのOSがクラッシュしていると考えてください」「あなたのコードは、ターミナルに湿布して ...私たちの手で、私たちの手で・・・)。

さあ、森の中の鍛冶屋さん...。

ここで議論を終えましょう!

 
Михаил:

さあ、良くも悪くも...です。

ここで議論を打ち切ろう!

問題ありません。自分の主張を通すのにうんざりしている...。
 
Artyom Trishkin:
問題ありません。自分の主張を通すのにうんざりしている...。

要は、サーバーのOSがダウンしても、サーボの再起動に必要なタイミングでアカウントの制御を回復させる家庭用PCを稼働させればいいわけです。

私のVDS/VPSサーバーでの作業では、OSが反転することはありませんでしたが、再起動は不測の事態で予定通り行われます。

私の質問の本質は、現在の状況について情報を収集するコードを有能に書くことです...

 
Vladimir Pastushak:

...

質問のポイントは、現在の状況に関する情報を収集するコードを正しく書くことです...。

ここで、すでに手続き的な書き方をしていると書かれていますね。だから、全部をクラスに集めればいいんです。関数呼び出しの 際にパラメータを削除したり、パラメータをプリセットするメソッド(magik, symbol)を作ることもできるが、やらないほうがいい。

もちろんやることがなければ、別の道でもいいんですけどね。クラスです。注文のリストを取得するためのメソッド Refresh() を備えています (唯一 false を返すことができます)。他のメソッドはこのリストを使用します。