新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1952

 
Vitaly Muzichenko #:

我插一句:)

有一个DAX30指数=从9到22的报价

在M15、H1等时间框架上,有什么方法可以查出一个时段内有多少个柱子。

Maxim Kuznetsov#:

(22*3600-9*3600)/PeriodSeconds(M15)

但这最好是 "这许多酒吧应该在9:00和22:00之间"。

时间范围越小,误差就越大,实际上几乎总是更小。你不能用历史记录来计算 "每隔N个小节的下一个时段"。

这就简单多了...

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Bars - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

大家下午好。

我需要你的帮助。

该EA有一个内置的当前利润的计数功能。

double GetProfitFromStart()
  {
   double lp=0,cp=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return(lp+cp);
  }
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
// Пишем какой лот текущий и какой следующий
      DrawLABEL("nextlot"   ,1,5,0,Color1(),StringConcatenate("CURRENT LOT: ",DoubleToStr(LOT(),2)));
      DrawLABEL("currentlot",1,5,0,Color2(),StringConcatenate("NEXT LOT: ",DoubleToStr(LOT(),2))); 
       DrawLABEL("lab_Take" ,1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2)));
      TrailingOrders();
   }

void OnTick的制作方法如上。

如何使利润计数器在条件满足时重置为0.0。

如果(CountOrders()==0) && (GetProfitFromStart()>0)

即所有的订单都被关闭,而最后一个订单被关闭时的总利润>0?

 

安装了MT4。关闭终端后不保存报价--每次都加载一个新的报价。

 
Maxim Kuznetsov #:

即使在4中,也最好是"先开放,后修改"。

不是每个人都允许你同时在市场上开仓和止损。

顺便说一句,止损并不是到处都有。你不可能到处得到它,它在经纪人的服务器上,这是他的个人服务(信用、风险、收益),而不是你认为的地方,没有止损单的交易渠道。

谢谢,是的,即使是不同经纪商的演示也显示了太多不同的条件。

 
законопослушный гражданин #:

大家下午好。

我需要你的帮助。

该EA有一个内置的当前利润的计数功能。

void OnTick的制作方法如上。

如何使利润计数器在条件满足时重置为0.0。

如果(CountOrders()==0) && (GetProfitFromStart()>0)

也就是说,所有的订单都被关闭,而最后一个订单被关闭时的总利润>0?

这项任务并不十分明确。每次计算功能都会开始浏览订单/仓位,并从零开始总结利润。

 double lp=0,cp=0;

你想把什么归零?如果你没有未结头寸/市场订单,计数功能将返回零。它将自己归零)))

 
законопослушный гражданин #:

大家下午好。

我需要你的帮助。

如何使利润计数器在条件满足时重置为0.0。

即所有订单都关闭了,而且最后一个订单关闭时的总利润>0?

这到底有什么不可行的地方呢?

 

下午好。请帮助。

寻找有负收益的封闭订单。
通过总计,它错过了,我没有得到所有负面订单的结果。

我正在学习写作。

double Minus_profit(){
 for (int i=OrdersHistoryTotal()-1; i>=0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
         if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic && (OrderType() == OP_BUY || OP_SELL)){
          if (OrderCloseTime()>=time && OrderTicket()>ticket){
            if (OrderProfit()+OrderSwap()+OrderCommission()<0){
             time=OrderCloseTime();
             ticket=OrderTicket();
             profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
             result=profit+swap+comis;   
   }}}}}return(result);
}
 
Alexander Avksentyev #:

下午好。请帮助。

寻找有负收益的封闭订单。
通过总计,它错过了,我没有得到所有负面订单的结果。

我正在努力学习如何写作。

匆匆一瞥,我看到你在从头到尾看一遍头寸,同时,你在变量中写下了收盘时间。结果可能是你捕捉到了最近一次平仓的时间,下一个条件就不再是真的了。

OrderCloseTime()>=time

因为其他职位的关闭时间较短。这将完全取决于排序,但在标准排序中,这就是问题所在。


同时修复这个条件

(OrderType() == OP_BUY || OP_SELL)

(OrderType() == OP_BUY || OrderType() == OP_SELL)

如果我们从历史中获取一个头寸,OrderProfit()将已经存储了包含掉期和佣金的最终结果。在公开的职位上--不,一切都必须总结。但这并不确定,请检查。

 
Nikita Chernyshov #:

一眼望去,我发现你是在从头到尾看一遍头寸,你把收盘时间写进了变量。结果可能是你捕捉到了最近一次平仓的时间,下一个条件就不再是真的了。

因为其他职位的关闭时间较短。这将完全取决于排序,但在标准排序中,这就是问题所在。


同时修复这个条件

如果我们从历史中获取一个头寸,OrderProfit()将已经存储了包含掉期和佣金的最终结果。在公开的职位上--不,一切都必须总结。但这并不准确,请检查。

谢谢你,这个工作很好。

double Minus_profit(){
time=TimeCurrent();
 for (int i=0; i<OrdersHistoryTotal(); i++){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
       if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic){
        if (OrderType() == OP_BUY || OrderType() ==OP_SELL){
         if (OrderCloseTime()>=time){
          if (OrderProfit()+OrderSwap()+OrderCommission()<=0){
              time=OrderCloseTime();
              profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
              result=profit+swap+comis;   
   }}}}}}return(result);
}

此外,当我们遇到一个正数利润的订单时,我们应该重置结果,寻找负数。

 
Alexander Avksentyev #:

下午好。请帮助。

寻找有负收益的封闭订单。
通过总计,它错过了,我没有得到所有负面订单的结果。

我正在学习写作。

我建议在这种和类似的情况下使用调试器。

原因: