初学者的问题 MQL5 MT5 MetaTrader 5 - 页 223

 
下午。请帮助一个初级 交易员找到一个合适的自动交易顾问,它能够在货币对中开出锁定的订单,并能任意设置止盈。谢谢你。
 
abcxyzabcxyz:
下午。请帮助一个初级交易员找到一个合适的自动交易顾问,它能够在货币对中开出锁定的订单,并可以任意设置止盈。谢谢你。
如果你真的需要锁定,你是在正确的地方。在MetaTrader 5上没有锁定,因为MetaTrader 5是一个净价平台。
MQL4: форум по механическим торговым системам и тестированию стратегий
  • www.mql5.com
MQL4: форум по механическим торговым системам и тестированию стратегий
 
micle:
或者:在所有的方法中声明Type方法,在其中返回类型标识符。

呵,如果你能编辑源代码......你不需要把事情简化得那么厉害。而且还是--在mql5中有一个类名吗?

 
YAndrey:

呵,如果你能编辑源代码......你不需要把事情简化得那么厉害。还是--有什么办法能让mql5知道一个类的名字吗?

朝着模板 的方向看 这段代码将返回类的名称或一个原始类型。

#include<Trade\Trade.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
空白OnStart()
{
//---
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("trade: type=",GetTypeName(trade);
//---
}
//+------------------------------------------------------------------+
//|以字符串形式返回类型|
//+------------------------------------------------------------------+
模板<类型名T>
string GetTypeName(const T&t)
{
//------返回类型为字符串
return(typename(T))
//---
}

 
C-4:

看向模式。这段代码将返回一个类或原始类型的名称。

#include<Trade\Trade.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
空白OnStart()
{
//---
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("trade: type=",GetTypeName(trade);
//---
}
//+------------------------------------------------------------------+
//|以字符串形式返回类型|
//+------------------------------------------------------------------+
模板<类型名T>
string 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),我们在策略测试器中得到一个消息,即该订单没有被选中,在策略测试器中,一切都开始工作,除了第一个订单。

 

而且我在HistorySelect()上遇到了一些问题。我通过发送市价订单用脚本开仓,如果有交易开启,我立即查看脚本启动后历史上的交易数量,并以一秒钟的间隔检查10次。很明显,应该有一个交易。 以下是脚本。

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);
                }
        }
}

而这里是Alfa-Forex的结果。

一笔交易实际上已经完成,但即使过了10秒也没有出现在历史上。它是什么?MT的错误?阿尔法故障?某种我不知道的芯片?Alpari的脚本工作正常,只是偶尔会在第一步(零)检测到零(嗯,可以理解--历史记录还没有来得及更新),其他步骤都是一。但十秒钟后,为什么历史上没有交易?

 
Algo:

而且我在HistorySelect()上遇到了一些问题。我通过发送市价订单用脚本开仓,如果有交易开启,我立即查看脚本启动后历史上的交易数量,并以一秒钟的间隔检查10次。很明显,应该有一个交易。 以下是脚本。

而这里是阿尔法经纪人的结果。

一笔交易实际上已经完成,但即使过了10秒也没有出现在历史上。这是什么?MT的错误?阿尔法故障?某种我不知道的芯片?Alpari的脚本工作正常,只是偶尔会在第一步(零)检测到零(嗯,可以理解--历史记录还没有来得及更新),其他步骤都是一。但为什么在十秒钟内历史上没有交易?

困扰我的是下面这句话

datetime dtStartTime = TimeCurrent();

你确定dtStartTime和TimeCurrent()不是同一时刻的数字吗?也许四舍五入到一秒,使完成的交易在dtStartTime之外。

 
C-4:

航线

datetime dtStartTime = TimeCurrent();

你确定dtStartTime和TimeCurrent()在时间上不是同一个数字吗?也许四舍五入到一秒的做法使完成的交易在dtStartTime之外。

即使是一个,MT也不应该输出那一秒钟的历史吗?也就是说,它不是在指定的限度内输出历史,包括限度本身吗?

但无论如何,我试着写了dtStartTime =TimeCurrent()- 1,以及dtStartTime = TimeCurrent() - 10。不起作用。