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

 
Vladislav Andruschenko:
展开,如果设置为当前。测试结束日期如果作为当前的账单。 可能还有很多原因。

固定价差, 结束日期 01.01.18

 
Aidar Kaliaskar:

固定价差,结束日期为18年1月1日


每点成本..... 等


这个周末试试。

 

我试图在MQL4中制作一个指标,通过 "US.30+"的收盘价在 "US.500+"图表中绘制一条线。一般来说,两个符号的价格线将在一个图表上可见。以下是代码,但它不起作用。在日志信息中 "自定义缓冲区的指标还不支持"。教教我为什么它不起作用。反对。

#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_color1 clrRed
#property indicator_style1 STYLE_DOT
#property indicator_type1  DRAW_LINE
//---
input string   symbolName="US.30+"; // Symbol name
input double   difference=-22387.0; // Difference from other symbol
//--- price buffer for other symbol
double otherSymbol[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,otherSymbol,INDICATOR_DATA);
//---
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int     rates_total,
                const int     prev_calculated,
                const int     begin,
                const double &price[])
  {
//---
   for(int i=prev_calculated;i<rates_total;i++)
      otherSymbol[i+1]=iClose(symbolName,PERIOD_CURRENT,i)+difference;
   ArraySetAsSeries(otherSymbol,true);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Maxim Khrolenko:

我试图在MQL4中制作一个指标,通过 "US.30+"的收盘价在 "US.500+"图表中绘制一条线。一般来说,两个符号的价格线将在一个图表上可见。以下是代码,但它不起作用。在日志信息中 "自定义缓冲区的指标还不支持"。教教我为什么它不起作用。反对。

因为你必须使用第一种形式的调用。
 
Artyom Trishkin:
因为你必须使用第一种形式的调用。
改变了它,并...成功了!非常感谢你。
 
STARIJ:

我找到了原因--60秒应该从一个循环中计算出来

谢谢你,谢谢你的澄清。

如果不是60秒,而是300秒。

开仓时间 不同,你需要写上与开仓时间相隔300秒。

我应该如何做呢?

 
lil_lil 如果是300秒而不是60秒......。你需要从开仓时起每隔300秒写一次。 你怎么做呢?

你试过我的方案吗?我真的不明白300...如果你设置300而不是60,是真的吗?如果你告诉我如何从中获利,我将尝试更好地理解它!

 

对EA的帮助,像往常一样,问题可能是微不足道的,但我还没有解决这个难题

如果从ema>smma 或者没有达到它的,就应该开仓买入(卖出也一样)。应该在收盘时结束交易--开一个新的酒吧。下一次开盘的方式相同,但条件是高于前一次的开盘价,也就是last_order_price

但最终,它在它想打开的地方打开,在它想关闭的地方关闭。(在测试开始时,它打开并立即关闭)

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int MA_period=10;
input int take=200, stop=200, Magic=1104;
input double lot=0.05;
input int slippage=30;
input int point=5;
double last_order_price,fast_MA,slow_MA;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   fast_MA=iMA(Symbol(),PERIOD_CURRENT,MA_period,0,MODE_EMA,PRICE_CLOSE,0);
   slow_MA=iMA(Symbol(),PERIOD_CURRENT,MA_period,0,MODE_SMMA,PRICE_CLOSE,0);
 
   if(fast_MA>slow_MA) last_order_price=0;
      else last_order_price=Ask+stop*_Point;

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

   fast_MA=iMA(Symbol(),PERIOD_CURRENT,MA_period,0,MODE_EMA,PRICE_CLOSE,0);
   slow_MA=iMA(Symbol(),PERIOD_CURRENT,MA_period,0,MODE_SMMA,PRICE_CLOSE,0);
   
   if(Bid<=fast_MA+point*_Point && Bid>=fast_MA && fast_MA>slow_MA && SymOrder() && Bid>last_order_price)
   {
      OrderSend(Symbol(),OP_BUY,lot,Ask,slippage,Ask-stop*_Point,Ask+take*_Point,NULL,Magic,0,clrBlue);
      last_order_price=Bid;
   }
   
   if(Bid>=fast_MA-point*_Point && Bid<=fast_MA && fast_MA<slow_MA && SymOrder() && Bid<last_order_price)
   {
      OrderSend(Symbol(),OP_SELL,lot,Bid,slippage,Bid+stop*_Point,Bid-take*_Point,NULL,Magic,0,clrRed);   
      last_order_price=Bid;
   }
      
   if(!SymOrder() && Volume[0]<2 && OrderType()==OP_BUY)
   {
      OrderClose(OrderTicket(),lot,Bid,slippage,clrWhite); 
      
   }
   if(!SymOrder() && Volume[0]<2 && OrderType()==OP_SELL)
   {
      OrderClose(OrderTicket(),lot,Ask,slippage,clrWhite);  

   }     
      
  }
//+------------------------------------------------------------------+
bool SymOrder()
{
   for(int i=0; i<OrdersTotal(); i++)
      {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) return false;
      }

   return true;
}
 
Roman Sharanov:

帮助EA,像往常一样,问题可能是微不足道的,但我还没有解决这个难题

如果从ema>smma 或者没有达到它的,就应该开仓买入(卖出也一样)。应该在收盘时结束交易--开一个新的酒吧。下一次开盘的方式相同,但条件是高于前一次的开盘价,也就是last_order_price

但最终,它在它想打开的地方打开,在它想关闭的地方关闭。(在测试开始时,它打开并立即关闭)

我可以如何建议?把你的代码保存在剪贴板上,写在专家顾问中,然后在策略测试器中 运行它?好吧,我将看到它打开和关闭。那又怎样?我可能会在演示中运行它--今天是星期六,明天是星期天,市场关闭。你必须用眼睛去看他们吗?那么,你必须牢记所有变量的值。早前有一种用纸笔调试的方法--试试吧。你也可以在所有OrderSelect 和OrderClose之前放一个Alert("Bid=", Bid, Fast+P=",Fast_Ema+point*_Point," ....),并在测试器中设置一天,例如从2月19日到20日,然后在测试后打开日志,做一个拷贝,删除不必要的行,进行分析。MetaEditor还有一个调试功能。当你学会如何调试...它将是伟大的。
 

它在哪里有一个按钮?

你能告诉我如何从#include <Controls\SpinEdit.mqh>(带增量的文本字段)中对齐CSpinEdit 控件中的文本。

默认情况下,它是向左边缘对齐的,但我想让它向右对齐。

原因: