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

 
spoiltboy:

很好。你能告诉我错误在哪里吗?

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  } 

一切顺利,以maxpr1的价格下了一个订单。

然后我想做同样的事,但以minpr1的价格。

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  }

错误130(错误停止)。我做错了什么?


当你下挂单时,开盘价不能离市场太近也可以使用MarketInfo()函数和MODE_STOPLEVEL参数获得挂牌价与当前市场价格的最小距离(以点为单位)。如果挂单的开仓价格不正确,将产生一个错误130(ERR_INVALID_STOPS)。

 
Alekseu Fedotov:
不,不是这样的,差距就在那里。我也试图改变买入待定,我在同一图表上进行了测试,它犯了同样的错误。
 
spoiltboy:
不,不是这样的,差距就在那里。此外,我试图改变我的买入待定,在同一图表上测试,同样的错误。

差距就是差距,但你可能没有读懂以下所有的内容

....... 如果 挂单开仓价格不正确,将产生错误130(ERR_INVALID_STOPS)..........

也就是说,你试图将OP_SELLLIMIT设置为低于市场价格

 
Alekseu Fedotov:

差距就是差距,但你可能没有读懂以下所有的内容

....... 如果 挂单开仓价格不正确,将产生错误130(ERR_INVALID_STOPS)..........

也就是说,你试图将OP_SELLLIMIT设置为低于市场价格

谢谢你。
 
//------------закрываем ордер по обратному сигналу удаляем или модифицируем отложки------

  for(int i2=total-1; i2>=0; i2--)
     if(OrderSelect(i2, SELECT_BY_POS))
         if(OrderSymbol()==Symbol()      )
         if (OrderMagicNumber()==Magic)
      {
      if (OrderType()==OP_BUY)
      {
     if (sig2==1)  {bool cl = OrderClose(OrderTicket(),OrderLots(),Bid,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
    
      }
      if (OrderType()==OP_SELL)
      {
     if (sig2==2)  {bool cl = OrderClose(OrderTicket(),OrderLots(),Ask,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
    
      }
    
      if (OrderType()==OP_BUYSTOP)
      {
    
     if (sig2==2&&Delete_Order==true)  {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
    
     //if (sig==1&&OrderOpenPrice()!=buystop_open&&Ask<buystop_open-stops) {bool mod = OrderModify(OrderTicket(),buystop_open,buystop_sl,0,0);Print("Мод. цены бай стоп=" ,buystop_open,", СЛ=",buystop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
    
      }
    
      if (OrderType()==OP_SELLSTOP)
      {
  
     if (sig2==1&&Delete_Order==true)  {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
  
     //if (sig==1&&OrderOpenPrice()!=sellstop_open&&Bid>sellstop_open+stops) {bool mod = OrderModify(OrderTicket(),sellstop_open,sellstop_sl,0,0);Print("Мод. цены бай стоп=" ,sellstop_open,", СЛ=",sellstop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
      
      }
      
      }

    
  
  }
//+------------------------------------------------------------------+
如果(FMA1<GrossMA1 && FMA2>GrossMA2 ) {sig=2;}。//卖出止损

如果(FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;}。//买入止损

没有任何信号可以自行关闭未平仓的交易。

 
Movlat Baghiyev:
如果(FMA1<GrossMA1 && FMA2>GrossMA2 ) {sig=2;}。//卖出止损

如果(FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;}。//买入止损

没有退出交易的信号。

在零条上,信号 "闪烁",这在事后是看不到的。对测试器中的所有刻度线运行可视化,问题会消失。
 
Vitalie Postolache:
在酒吧零点,信号 "闪烁",这在事后是看不到的。对测试器中的所有刻度线运行可视化,问题会消失。
这不是问题。 当订单触发时,交易开始,当新的蜡烛 出现时立即关闭,没有反向信号。 这就是为什么我给你一段关闭交易的代码。
 
Movlat Baghiyev:
这不是问题,当订单被触发时,交易被打开,当新的蜡烛 出现且没有反向信号时,交易被立即关闭。 这就是为什么我给你一段关闭交易的代码。
你需要在设置后将变量"sig " 置空,因为信号将是恒定的,如果你将其置空,那么该变量将在下一次穿越后再次取值,在完成所有动作后再次置空。或者你可以放一个标志,如果有一个向上的交叉点,下一个应该是向下的,如果没有向下的交叉点,那么所有的信号都被忽略,直到有一个反向交叉点。
 

你好。

你能告诉我什么是错的吗?

如果指标线 已经越过20级,在M1周期,并且指标线在50级以上,在M5周期,该图标应该被设置。

由于某些原因,即使M5上的线低于50的设定水平,该标记也被设定了。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;

for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
  double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
  double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
  
   double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
  double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
  
  if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
  {
   UP[i]=Low[i]-distance*MyPoint;
  }
  //if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
  //{
  // DOWN[i]=High[i]+distance*MyPoint;
  //}
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
mila.com:

你好。

你能告诉我什么是错的吗?

如果指标线 已经越过20级,在M1周期,并且指标线在50级以上,在M5周期,该图标应该被设置。

由于某些原因,即使M5上的线低于50的设定水平,该标志也会被设置。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;

for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
  double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
  double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
  
   double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
  double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
  
  if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
  {
   UP[i]=Low[i]-distance*MyPoint;
  }
  //if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
  //{
  // DOWN[i]=High[i]+distance*MyPoint;
  //}
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }

你的周期很奇怪。很奇怪。

//+------------------------------------------------------------------+
   if(rates_total<xxx) return(0);         // xxx здесь - количество баров, при которых невозможно рассчитать индикатор
   int limit=rates_total-prev_calculated;
   if(limit>1) {                          // limit больше 1 в том случае, когда в истории произошли изменения
      limit=rates_total-1;                // не обязательно -1, если в цикле есть i+1, значит limit=rates_total-2, и т.д., и т.п.
      // тут проводим действия когда нужно пересчитать всю историю
      }
//---
   for(int i=limit; i>=0; i--) {
      // основной цикл индикатора
      }
//+------------------------------------------------------------------+

为什么限制检查超过1。例如,历史被加载,差异将大于1。如果一切正常,那么差额Rates_total-prev_calculated将是0或1。
0 - 一个新的刻度线已经到来,一个新的柱子还没有开始形成。
1 - 一个新的刻度线已经到来,一个新的条形图已经开始形成

向我们展示你的整个指标--让我们看看有什么问题。

原因: