任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 210

 

下午好。

我的策略考虑到了价差,价差是由一个函数定义的。

double Spread_(){
   double spread = 0.0;
     RefreshRates();
     spread = MathRound((Ask - Bid) / Point);
   return(spread);
}   

但由于策略测试器中 的点差是恒定的,我需要一个随机点差模拟器。我想在80%的情况下模仿测试器中2到3点(4位数)范围内的传播变化,在20%的情况下模仿超过3点的传播。有什么想法可以实现这一点,或者是解决了这种想法的链接。

 
artmedia70:


魔术师的错误导致你的EA在停止时看不到它的头寸是在停止时关闭的。为什么?答案是,你用magic 123开仓,并将变量Magic发送给检查在止损点平仓的函数。你认为它在隐式初始化时等于什么?零。该函数自然是在搜索带有神奇数字0的位置,并且在你的位置上等于123。而且我们不是在争论,只是......推理...检查反应,在停止时关闭。


我没有看你的 "死 "的EA逻辑的其余部分--我在帮你弄清楚停止关闭检查功能...


Artem !日安!再次感谢您的帮助。

我已经删除了所有不必要的 "死亡 "逻辑,并 "恢复 "了剩下的那些....。就我的理解而言。

只留下一个功能,你已经帮我解决了。

但奇迹开始发生,超出我的理解范围

1. 我的专家顾问在每根 蜡烛开始时开启交易(我有一个5分钟的蜡烛)。

而忽略了所有的条件。

即控制进入第一行

double Price=iOpen(Symbol (),0,0);

然后它跳过11行,到了以下几行

Lot=0.1;

OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point, "jfh",123)。

2. 如果我们删除计算最小手数的那一行 Lot=MarketInfo(Symbol(), MODE_MINLOT)

专家顾问工作正常,但isCloseLastPosByStop函数却不工作

我绞尽脑汁想了很久.....,但徒劳无功。如果你能告诉我错误藏在哪里,我将不胜感激。

double   Lot = 0.1;                                          //я проинициализировал переменную
int      Magic=123;

int start() 
{

   double Price=iOpen(Symbol (),0,0);                      //запоминаем время открытия очередной свечи
   int ot=OrdersTotal();                                   //запоминаем количество всех открытых ордеров
      if ((ot==0)                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)      //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)       //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
                &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))  //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
                
                  Lot=MarketInfo(Symbol(), MODE_MINLOT);                  //вычислить минимальный лот инструмента
                               
                  if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                                                   //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                  else                                                    //в противном случае(если функция на вернула ??????
                     {
                     Lot=0.1;                                             // лот отстается 0.1       
                     OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                      
   return(0);
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      dg, i, j=-1, k=OrdersHistoryTotal()-1;
   datetime t=0;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)          continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}


 

solnce600

Артем ! Добрый день! Еще раз спасибо за помощь.

我所有的 "死逻辑 "都被删除了,不必要的和 "复苏 "的恢复....。就我的理解而言。

我实际上只留下了功能,你帮我纠正了这一点。

但是超出我理解的奇迹已经开始发生。

之后

 if ((ot==0)                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
               &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))

将所有内容添加到正文中 { }

对不起,我不是Artem。

 
ALXIMIKS:

solnce600

之后

将所有内容添加到正文中 { }

我很抱歉我不是阿特姆。

谢谢。请原谅我的第一次.......(我不知道如何添加开玩笑的表情符号)
 
 t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );

t或Lot ??

 
ALXIMIKS:

solnce600

之后

将所有内容添加到正文中 { }

对不起,我不是Artem。

按照你说的做了.....,唉,顾问工作....,isCloseLastPosByStop函数不工作。

double   Lot=0.1;
int      Magic=123;

int start() 
{

   double Price=iOpen(Symbol (),0,0);  //запоминаем время открытия очередной свечи
   int ot=OrdersTotal();               //запоминаем количество всех открытых ордеров
      if ((ot==0)                      //если ордеров в рынке никаких нет
      &&(Bid==Price)                   //И ПРИ ЭТОМ  если ПРИ ЭТОМ  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
               &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
               
                {
                  Lot=MarketInfo(Symbol(), MODE_MINLOT);            //вычислить минимальный лот инструмента
                               
                  if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                            //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     Lot=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                  else  //в противном случае(если функция на вернула??????
                     {
                     Lot=0.1; // лот отстается 0.1       
                     OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                     } 
   return(0);
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      dg, i, j=-1, k=OrdersHistoryTotal()-1;
   datetime t=0;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)          continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
 

这是函数bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) 中的一段代码。

但如果有3个点的滑落怎么办?这不是很好的想法 ))

 if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
 
solnce600:

你明白的--我并不怎么在意,然而....。

我已经尝试了一个星期,想弄清楚为什么这个功能对我不起作用。

也就是说,我需要下一个订单的开仓量是止损点关闭的订单的两倍,而下一个订单的开仓量则是不停机后的正常量。


纠正工作的逻辑,否则将需要很长的时间来思考
 
ALXIMIKS:

这是函数bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) 中的一段代码。

但如果有3个点的滑落怎么办?这不是很好的想法 ))


你明白的--我不会去管它,然而....。

一个星期以来,我一直不明白为什么这个功能不能按我想要的方式工作。

也就是说,我需要在止损后以止损时收盘的双倍成交量开出下一个订单,而在非止损后,以正常成交量开出下一个订单。
 

为什么要触碰订单历史 呢? 看看余额--它在哪里去了那个方向,然后改变地段。

如果它只是一个机器人,将在你的账户上进行交易。