初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 223

 
午後初心者トレーダーが、自動売買に適したアドバイザーで、通貨ペアでロックされた注文を、任意のテイクプロフィット設定の可能性で開くことができるものを見つけるのを助けてください。ありがとうございます。
 
abcxyzabcxyz:
午後初心者トレーダーが、自動売買に適したアドバイザーで、通貨ペアでロックされた注文を、任意のテイクプロフィット設定の可能性で開くことができるものを見つけるのを助けてください。ありがとうございます。
もし、本当にロックが必要なら、あなたは正しい 場所にいるのです。MetaTrader 5はネッティングプラットフォームであるため、ロックはありません。
MQL4: форум по механическим торговым системам и тестированию стратегий
  • www.mql5.com
MQL4: форум по механическим торговым системам и тестированию стратегий
 
micle:
あるいは、それら全てにTypeメソッドを宣言し、その中で型識別子を返すようにする。

へー、ソースコードを編集できれば...。そんなに簡略化しなくてもいいんじゃないですか?それにしても......mql5にはクラス名があるのでしょうか?

 
YAndrey:

へー、ソースコードを編集できれば...。そんなに簡略化しなくてもいいんじゃないですか?それでも - mql5がクラスの名前を知る方法はあるのでしょうか?

テンプレートの 方向を見てください。このコードでは、クラス名またはプリミティブ型を返します。

#include<TradeTrade.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
voidOnStart()
{
//---
CTradeトレード
double d_value=M_PI;
int i_value=INT_MAX;
Print("d_value: type=",GetTypeName(d_value),", value=", d_value);
Print("i_value: type=",GetTypeName(i_value),", value=", i_value);
Print("取引:type=",GetTypeName(trade);
//---
}
//+------------------------------------------------------------------+
//| 型を文字列で返す|
//+------------------------------------------------------------------+
template<typename T>
文字列 GetTypeName(const T&t)
{
//---型を文字列で返す
return(typename(T)) する。
//---
}

 
C-4:

パターンに 目を向ける。このコードは、クラスまたはプリミティブ型の名前を返します。

#include<TradeTrade.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
voidOnStart()
{
//---
CTradeトレード
double d_value=M_PI;
int i_value=INT_MAX;
Print("d_value: type=",GetTypeName(d_value),", value=", d_value);
Print("i_value: type=",GetTypeName(i_value),", value=", i_value);
Print("取引:type=",GetTypeName(trade);
//---
}
//+------------------------------------------------------------------+
//| 型を文字列で返す|
//+------------------------------------------------------------------+
template<typename T>
文字列 GetTypeName(const T&t)
{
//---型を文字列で返す
return(typename(T)) する。
//---
}

何かある!しかし、それは新しいと動作しません - コードでは、私が必要とするものの例があります - 多分誰かが方法を提案することができますか?

class a{
public:
virtual void Print(){Print("Print class a");}
};

class b:public a{
public:
virtual void Print(){Print("Print class b");}
};

class c:public a{
public:
virtual void Print(){Print("Print class c");}
void Print2(){Print("!Print2! class c");}
};


void add(a *&arr[], bool var)
{
   ArrayResize(arr, ArraySize(arr)+1);
   if (var)
      arr[ArraySize(arr)-1] = new b;
   else
      arr[ArraySize(arr)-1] = new c;
   
}

void OnStart()
  {
//--- 
   
   
   a *arr[];

   add(arr, true); // На самом деле здесь я НЕ знаю, какой класс добавит функция add
   add(arr, false); // Это потомок класса а или сам класс а, исходный код которого я править не могу.
   for (int i = 0; i < ArraySize(arr); i++)
   {
      // Вот тут то мне и надо узнать, что за класс там
      // шаблон вернет *а, как и объявлено. Но мне надо проверить - можно ли вызвать функцию, которая есть только в с
      if (i == 1) // Вот тут должна быть проверка на имя класса
      {
         c *tmp = arr[i];
         tmp.Print2();
      }
    }  
   
   
   
   
   
//--- 
  }
 
YAndrey:

何かある!しかし、それは新しいと動作しません - 私が必要とするもののコードに例があります - 誰でも任意の方法を提案することはできますか?

これは、テンプレートメソッドの問題です。残念ながら、このテンプレートメソッドはインスタンスを参照しているクラスの名前を返します。インスタンスの種類そのものはまだ不明です。
 

なぜ、このコードはテスターでは動作せず、リアルタイムでは動作するのか、誰か説明してください!?具 体的には、テスターでHistorySelect(0, TimeCurrent())の後、HistoryOrderGetInteger...が発生する理由に興味があります。

#include <Trade\Trade.mqh>

CTrade trade;

int OnInit()
{
   trade.LogLevel(LOG_LEVEL_NO);
   return INIT_SUCCEEDED;
}
void OnTick()
{
   if(!DetectNewBar())return;
   trade.Sell(0.1);
   HistorySelect(0, TimeCurrent());
   for(; dealsCount < HistoryDealsTotal(); dealsCount++)
   {
      ulong ticket = HistoryDealGetTicket(dealsCount);
      RecalcDeal(ticket);
   }
}

bool DetectNewBar(void)
{
   MqlRates bars[1];
   CopyRates(Symbol(), PERIOD_M1, 0, 1, bars);
   if(bars[0].time != timeLastBar)
   {
      timeLastBar = bars[0].time;
      //printf(expertName + " new bar detected: " + TimeToString(bars[0].time));
      return true;
   }
   return false;
}

void RecalcDeal(ulong ticketDeal)
{
   //History is selected in OnTick()!
   ulong ticketOrder = HistoryDealGetInteger(ticketDeal, DEAL_ORDER);
   //if(!HistoryOrderSelect(ticketOrder))
   //   printf("order not select.");
   ENUM_ORDER_TYPE type = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(ticketOrder, ORDER_TYPE);
   datetime time = HistoryOrderGetInteger(ticketOrder, ORDER_TIME_SETUP); 
   ulong time_msc = HistoryOrderGetInteger(ticketOrder, ORDER_TIME_SETUP_MSC); 
   printf("Order: " + (string)ticketOrder + " Type: " + EnumToString(type) + " Time: " + (string)time +
          " Time msc: " + (string)time_msc + " Total Orders: " + HistoryOrdersTotal());
}

int dealsCount;

datetime timeLastBar;

ストラテジーテスターでの画面。

デモでのリアルタイムのスクリーンショット。

p.s. 興味深いのは、テスターの最初の注文は正しく処理されるのに、他の注文は処理されないことです。また、HistroryOrderSelect(ticketOrder)をコメントすると、Strategy Testerでは注文が選択されていないというメッセージが表示され、Strategy Testerでは、最初の注文を除いてすべて動作し始めます。

 

また、HistorySelect()に問題があります。スクリプトで成行注文を出してポジションを開き、取引が開始されたら、すぐにスクリプトを立ち上げてからの履歴の取引件数を、1秒間隔で10回確認するんです。当然ながら、トレードは1回にすべきです。 以下、スクリプトです。

void OnStart()
{
        // время запуска скрипта
        datetime dtStartTime = TimeCurrent();
        
        // структуры запроса
        MqlTradeRequest oRequest = {0};
        MqlTradeResult oResult = {0};
        
        // формируем запрос
        oRequest.action = TRADE_ACTION_DEAL;
        oRequest.magic  = 15;
        oRequest.symbol = _Symbol;
        oRequest.volume = 0.1;
        oRequest.type   = ORDER_TYPE_BUY;
        oRequest.type_filling = ORDER_FILLING_FOK;
        oRequest.price  = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
        oRequest.deviation = 1000;
        
        // шлём ордер
        bool bResult = OrderSend(oRequest, oResult);
        
        // если позиция успешно открыта
        if(bResult == true && oResult.retcode == 10009) // если позиция открыта
        {
                for(int i = 0; i < 10; i++)
                {
                        // запрашиваем историю за время работы скрипта
                        HistorySelect(dtStartTime, TimeCurrent());
                
                        // количество сделок за время работы скрипта (должна быть одна)
                        Print("Шаг: ", i, " Совершено сделок: ", HistoryDealsTotal());
                        
                        Sleep(1000);
                }
        }
}

そして、こちらがアルファフォレックスの結果です。

実際にトレードが行われるが、10秒経っても履歴に残らない。何ですか?MTのバグ?αの不具合?知らないチップのようなもの?Alpariのスクリプトは正常に動作しますが、最初の(ゼロ)ステップでたまにゼロが検出されます(まあ、それは理解できます - ヒストリがまだ更新する時間がないのです)、他のすべてのステップは1です。しかし、10秒後に、なぜ履歴に取引がないのか?

 
Algo:

また、HistorySelect()に問題があります。スクリプトで成行注文を出してポジションを開き、取引が開始されたら、すぐにスクリプトを立ち上げてからの履歴の取引数を、1秒間隔で10回確認するんだ。当然ながら、トレードは1回にすべきです。 以下、スクリプトです。

そして、こちらがアルファブローカーからの結果です。

実際にトレードが行われるが、10秒経っても履歴に残らない。これは何でしょう?MTのバグ?αの不具合?知らないチップのようなもの?Alpariのスクリプトは正常に動作しますが、最初の(ゼロ)ステップでたまにゼロが検出されます(まあ、それは理解できます - ヒストリがまだ更新する時間がないのです)、他のすべてのステップは1です。しかし、なぜ10秒後に歴史に残るような取引がないのでしょうか?

気になるのは、次の行です。

datetime dtStartTime = TimeCurrent();

dtStartTimeとTimeCurrent()が一瞬で同じ数字にならないのは確かでしょうか?1秒に丸めることで、完了したトランザクションをdtStartTimeの外に置いているのかもしれません。

 
C-4:

ライン

datetime dtStartTime = TimeCurrent();

dtStartTimeとTimeCurrent()は、time forで同じ数字になっていませんか?おそらく、1秒に丸めることで、完了したトランザクションをdtStartTimeの外に置いているのでしょう。

また、1つであっても、その2つ目の履歴はMTが出力すべきなのでは?つまり、指定された制限の範囲内で、制限そのものを含めて履歴を出力するのではないのでしょうか?

しかし、とにかく、dtStartTime =TimeCurrent()- 1 と dtStartTime = TimeCurrent() - 10 の両方を書いてみました。動作しない。

理由: