[存档!]任何菜鸟问题,为了不给论坛添乱。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 2. - 页 149

 
Vovo4ka:

伙计们,错误在哪里看....a,然后在信号处打开几个头寸,有时会错过信号....a,然后在触发对的止损或利润后,打开一个新的....。

Look.... 条件:RSI与周期14和17的水平30从下到上同时交叉,上升趋势70从上到下...


A1=diRSI1;
      A2=diRSI2;
他们为什么要追求条件?
 
Vovo4ka:

伙计们,错误在哪里看....a,然后在信号处打开几个头寸,有时会错过信号....a,然后在触发对的止损或利润后,打开一个新的....。

Look.... 条件:RSI与周期14和17的水平30从下到上同时交叉,上升趋势70从上到下...


 if (( diRSI1<30 && diRSI2<30)){      
         OpenBuy();
         return(0);
      }

      if (diRSI1>70 && diRSI2>70){
         OpenSell();
         return(0);
      }
我会这样做,我也会设置一个买入止损,而不是卖出。
 
todem:
我将这样做,我将设置买入止损,而不是卖出。


哈...以你的方式,任何低于30的值都可以打开交易!!!!!!!,这是不可接受的....,我需要一个从下到上的30水平交叉!!!!!。

和价值

A1=diRSI1;
      A2=diRSI2;

这些只是前一根蜡烛的RSI值,....,它们必须小于30!!这里的一切都很正确......我只是不明白为什么在一个信号下,交易要分几块开仓。

 
todem:
我会这样做,它不会立即被设定为买入,而是被设定为停止,也不会被设定为卖出,而是被设定为停止。
 
Vovo4ka:


哈...你的方法是,任何低于30的数值都可以打开交易!!!!!!!,这是不可接受的....,我需要从下往上的30水平的交叉点!!!!!。

和价值

这些只是之前开仓蜡烛的RSI值....,它们必须小于30!!这里的一切都很正确......我只是不明白为什么交易在一个信号下被打开了好几次!

如果你想让它开一个交易,你不能让它开386个,它比这快得多,这可以在1秒钟内执行一百万个交易。控制一笔交易的开盘是通过控制开盘交易来完成的。如果你总共有0个交易,就打开它们,如果没有,你就完蛋了。
 
todem:
如果你想让它开一笔交易,那是不行的--这是一台386电脑,它的速度更快,可以在1秒钟内完成一百万笔交易。通过控制已开立的交易,控制开立一个交易。如果你总共有0个交易,就打开它们,如果没有,你就完蛋了。


嗯...这就是重点,如果有一百万个交易,那么交易应该被打开,....。

好的,我会想办法解决的)))如果有控制交易的代码,请告诉我......))。

 
Vovo4ka:


嗯...这就是问题所在--如果有一百万个交易,那么交易应该由一个交易打开......

好的,我会想办法解决的)))如果有交易控制的代码,请给我吧)))。

int OrdCon(int nap, int MGV)
  {
    int result=0;
    for (int i=0;i<OrdersTotal();i++) {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if ((nap==0) && (OrderSymbol() == Symbol())&& (OrderMagicNumber() == MGV)) {
        result=result+1; // открыт ордер бай 
      }
      if ((nap==1) && (OrderSymbol() == Symbol()) && (OrderMagicNumber() == MGV)) {
        result=result+1; // открытый ордер селл 
      }
    }
    return(result); // 0 means we have no trades
  }
以下是该函数
 
todem:
这里有一个函数

      if ((nap==0) && (OrderSymbol() == Symbol())&& (OrderMagicNumber() == MGV)) {
        result=result+1; // открыт ордер бай 
      }
      if ((nap==1) && (OrderSymbol() == Symbol()) && (OrderMagicNumber() == MGV)) {
        result=result+1; // открытый ордер селл 
      }

在这一点上,根据什么得出结论,未结订单是卖出还是买入?

这里是上面的整个代码。

int OrdCon(int nap, int MGV)
  {
    int result=0;
    for (int i=0;i<OrdersTotal();i++) {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if ((nap==0) && (OrderSymbol() == Symbol())&& (OrderMagicNumber() == MGV)) {
        result=result+1; // открыт ордер бай 
      }
      if ((nap==1) && (OrderSymbol() == Symbol()) && (OrderMagicNumber() == MGV)) {
        result=result+1; // открытый ордер селл 
      }
    }
    return(result); // 0 means we have no trades
  }
 

在这里,我已经用我的顾问优化了你的PSI

 
//+------------------------------------------------------------------+
//|                                               20/200 expert.mq4  |
//|                                                    1H   EUR/USD  |
//|                                                    Smirnov Pavel |
//|                                                 www.autoforex.ru |
//+------------------------------------------------------------------+

#property copyright "Smirnov Pavel"
#property link      "www.autoforex.ru"

extern int TakeProfit = 20; // Уровень тейкпрофит в пунктах
extern int StopLoss = 200; // уровень стоплосс в пунктах
extern int TradeTime=18;
extern int t1=7;
extern int t2=2;
extern int delta=7;
extern int dayout=1;
extern double lot = 0.1;

int ticket;
bool cantrade=true;

int OpenLong(double volume=0.1)
{
  int slippage=10;
  string comment="20/200 expert (Long)";
  color arrow_color=Red;
  int magic=0;

  ticket=OrderSend(Symbol(),OP_BUY,volume,Ask,slippage,Ask-StopLoss*Point,
                      Ask+TakeProfit*Point,comment,magic,0,arrow_color);
  if(ticket>0)
  {
    if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
    {
      Print("Buy order opened : ",OrderOpenPrice());
      return(0);
    }  
  }
  else 
  {
    Print("Error opening Buy order : ",GetLastError()); 
    return(-1);
  }
}
  
int OpenShort(double volume=0.1)
{
  int slippage=10;
  string comment="20/200 expert (Short)";
  color arrow_color=Red;
  int magic=0;  
  
  ticket=OrderSend(Symbol(),OP_SELL,volume,Bid,slippage,Bid+StopLoss*Point,
                      Bid-TakeProfit*Point,comment,magic,0,arrow_color);
  if(ticket>0)
  {
    if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
      {
        Print("Sell order opened : ",OrderOpenPrice());
        return(0);
      }  
  }
  else 
  {
    Print("Error opening Sell order : ",GetLastError()); 
    return(-1);
  }
}

int init()
{
  return(0);
}

int deinit()
{   
  return(0);
}

int start()
{
  if((TimeHour(TimeCurrent())>TradeTime)) cantrade=true;  
  // проверяем есть ли открытые ордера ...
  if(OrdersTotal()<1)
  {
    // ... если нет ни одного открытого ордера, то идем дальше
    // проверяем настало ли время для торговли
    if((TimeHour(TimeCurrent())==TradeTime)&&(cantrade)&&(TimeDayOfWeek(TimeCurrent())!=dayout))
    {
      // ... если настало время, то
      if ((Open[t1]-Open[t2])>delta*Point) //Если цена изменилась на величину delta
      {
        //условие выполнено значит входим в короткую позицию:
        // проверяем есть ли свободные деньги для открытия короткой позиции
        if(AccountFreeMarginCheck(Symbol(),OP_SELL,lot)<=0 || GetLastError()==134)
        {
          Print("Not enough money");
          return(0);
        }
        OpenShort(lot);
        cantrade=false; //запрещаем торговать повторно до следующего бара
        return(0);
      }
      if ((Open[t2]-Open[t1])>delta*Point) //Если цена изменилась на величину delta
      {
        // условие выполнено значит входим в длинную позицию
        // проверяем есть ли свободные деньги на счету
        if(AccountFreeMarginCheck(Symbol(),OP_BUY,lot)<=0 || GetLastError()==134)
        {
          Print("Not enough money");
          return(0);
        }
        OpenLong(lot);
        cantrade=false;
        return(0);
      }
    }
  }   
  return(0);
}
你认为这个顾问怎么样?