[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 335

 
borilunad:
然后在你自己的地方做一些挖掘工作!你的代码的每一个字都有一个函数,你需要用变量来做。这就是使代码变得沉重的原因。当你不能不使用函数时,你应该使用它们!我在Kim的代码中评论了所有我不需要的东西,而且所有的工作都非常快!这就是为什么我们要使用函数。记住,我问大家如何使程序在许多条件下运行得更快。现在,在5分钟内对所有蜱虫进行了一年的测试!我梳理了所有的条件和功能,扔掉了所有不必要的东西。

我当然记得。我将保持一段时间。事实上,我需要改变我的习惯。这不是第一个说我的代码不容易理解的程序员。显然,它是...
 
borilunad:
所以在自己的地方挖吧!你的代码中的每一个字都有一个函数,而 你必须用变量来做。这就是为什么你的代码很重。 当你不能没有函数时,你应该使用它们!我在Kim的代码中注释了所有我不需要的东西,而且所有的工作都非常快记住,我问大家如何使程序在许多条件下运行得更快。现在,在5分钟内对所有蜱虫进行了一年的测试!我梳理了所有的条件和功能,扔掉了所有不必要的东西。

只有当我们在测试器中测试策略 时,才能省去变量。

对于真实,执行逻辑所需的每一个值都必须在正确的时间点上计算出来,因为这些变量的值非常容易丢失,例如在重新启动时

 

祝大家今天愉快。

我已经想出了如何写索引,但我对第一个机器人有问题。这似乎是合乎逻辑的,编译器没有抱怨,日志也没有错误,但测试器中的专家顾问没有工作--图表打开了,但这个图形上没有任何移动(图表没有移动)。

该想法如下。该指标产生一个买入或卖出的点(总是在蜡烛的开盘和开盘价),同时机器人的任务是在收到买入或卖出的点后,关闭相反的订单,在同一方向开立新的或修改旧的订单(停止和TP由另一个指标发出)。

如果您能提示我哪里错了,我将非常感激。

代码本身(根据其功能改变了指数名称,删除了变量的声明 和错误处理部分)。

   // Предварит.обработка

   if(High[0]!=Low[0]) return; //если бар открылся до поступления текущей котировки, выход из start

       vverh = iCustom(NULL,0,"Индикатор дающий точку на покупку",Glubina,Pogreshnost,0,0);   //значение индикатора на покупку
       vniz  = iCustom(NULL,0,"Индикатор дающий точку на продажу",Glubina,Pogreshnost,1,0);   //значение индикатора на продажу
       
   if(vverh==0 && vniz==0)
     {
      Alert("Сигнала нет. Эксперт ждёт сигнал.");
      return;
     }
   if(Bars < Glubina)                       // Недостаточно баров
     {
      Alert("Недостаточно баров в окне. Эксперт не работает.");
      return;                                   // Выход из start()
     }
   if(Work==false)                              // Критическая ошибка
     {
      Alert("Критическая ошибка. Эксперт не работает.");
      return;                                   // Выход из start()
     }

//--------------------------------------------------------------- 4 --
   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(i=1; i<=OrdersTotal(); i++)              // Цикл перебора ордеров
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderMagicNumber()!=MagicNumber)   // Попался ордер открытый не советником
            continue;
            
         Total++;                               // Счётчик ордеров открытых советником
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько ордеров одного советника. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
//--------------------------------------------------------------- 5 --
// торговые критерии
if(vverh>0)
  {
   Opn_B=true;
   Cls_S=true;
   Opn_S=false;
   Cls_B=false;
  }
if(vverh>0)
  {
   Opn_S=true;
   Cls_B=true;
   Opn_B=false;
   Cls_S=false;
  }
  
//--------------------------------------------------------------- 6 --
   
   //расчет стопов
   i_stop=0;
   while (stopov_for_S<2)                                                        //ищем 2 последних точки стопа в индикаторе, выбираем изз них самую дальнюю от текущей цены
         {
          for_S = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,0,i_stop);
          if (for_S>0)
             {
              stopov_for_S++;
              if(Stop_for_S<for_S) Stop_for_S=for_S;
             }
          i_stop++;
         }
   i_stop=0;
   while (stopov_for_B<2)
         {
          for_B = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,1,i_stop);
          if (for_B>0)
             {
              stopov_for_B++;
              if(Stop_for_B<for_B) Stop_for_B=for_B;
             }
          i_stop++;
         }
SL_for_B = Stop_for_B-pogreshnostSL;
SL_for_S = Stop_for_S+pogreshnostSL;
TP_for_B=vverh+(vverh-Stop_for_B)*koeff_dvizheniya;
TP_for_S=vniz-(Stop_for_S-vniz)*koeff_dvizheniya;


   // Закрытие и модификация ордеров
   while(true)                                  // Цикл закрытия и модификации орд.
     {
      if (Tip==0 && Opn_B==true)                // Если открыт ордер БАЙ и индикатор дает сигнал на покупку
             {
              OrderModify(Ticket,SL_for_B,TP_for_B,0,CLR_NONE); //меняем стопы текущего ордера бай
              break;
             }
      if (Tip==0 && Opn_S==true)                // Если открыт ордер БАЙ и индикатор дает сигнал на продажу
             {
              RefreshRates();
              Ans=OrderClose(Ticket,Lot,Bid,50);        // закрываем БАЙ
                 if (Ans==true)                         // Получилось :)
                    {
                     Alert ("Закрыт ордер Buy ",Ticket);
                     break;                             // Выход из цикла закр
                    }
                 if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                     continue;                          // Повторная попытка
             }
      
      if (Tip==1 && Opn_S==true)
             {
              OrderModify(Ticket,SL_for_S,TP_for_S,0,CLR_NONE);
              break;
             }
      if (Tip==1 && Opn_B==true)
             {
              RefreshRates();
              Ans=OrderClose(Ticket,Lot,Ask,50);
                 if (Ans==true)                         // Получилось :)
                    {
                     Alert ("Закрыт ордер Sell ",Ticket);
                     break;                             // Выход из цикла закр
                    }
                 if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                     continue;                          // Повторная попытка
             }
     }
//--------------------------------------------------------------- 7 --
   // Стоимость ордеров
   RefreshRates();                              // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера

   if (Lots > 0)                                // Если заданы лоты,то 
      Lts =Lots;                                // с ними и работаем 
   else                                         // % свободных средств
      Lts=MathFloor(Free*Prots/One_Lot/Step )*Step;// Для открытия

   if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                      // Лот дороже свободн.
     {
      Alert(" Не хватает денег на ", Lts," лотов");
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------- 8 --
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      Ticket=0;
      if (Opn_B==true)                          // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,50,SL_for_B,TP_for_B,"My order #",MagicNumber,0,CLR_NONE);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                            // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
        
      if (Opn_S==true)                          // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,50,SL_for_S,TP_for_S,"My order #",MagicNumber,0,CLR_NONE);//Открытие Sell
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                            // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
     }
//--------------------------------------------------------------- 9 --
   return;                                      // Выход из start()
  }

 
If (торговые условия сигнал №1)
  {
  }//   Какой код нужен, чтобы тело оператора №1 в случае соответствия, передало управление к оператору  «торговых       условий №2»    

If (торговые условия сигнал №2)
  {
  }// Какой код нужен, чтобы тело оператора №2 в случае соответствия, передало управление к оператору «торговых       условий №3 и №4»    

If (торговые условия сигнал №3)
  {                                          
   Opn_B=true;                            
   }
   else
If (торговые условия сигнал №4)
  {                                          
   Opn_S=true;                            
   }
     else
         return(0);

问题的实质如下。不清楚在操作者#1,2的正文中的大括号里应该写些什么,事实上,已经检查了交易条件的遵守情况,没有更多的行动。

(有四个交易信号,1号触发,我们把控制权传给2号处理信号,2号触发,我们把它传给3号和4号处理信号,在那里进行交易操作)。

  else
         return(0);

是否值得把它加到最后?从逻辑上讲,如果信号#3,4没有触发,那么我需要专家顾问重新开始。

 
artmedia70:

变量只能在测试器中测试策略时使用

对于现实世界来说,执行逻辑所需的每一个值都必须在正确的时间计算出来,因为这些变量的值非常容易丢失,例如在重新启动时

但是写在extern中的变量会丢失吗?这事从未发生过!但是,所有的条件都在我的眼前,在start()中唾手可得,而函数,在start()之外,有检查和最终的不可改变的行动!我可能大错特错,但到目前为止,我对这种方式很满意,而且我还没有在Real上得到一个错误或回扣!我总是仔细阅读你的帖子,Artem,还有其他有经验的程序员,如alsuMeat 和其他人,以及客座版主!我认为这是对的。但并不是所有的东西都还在我的能力范围内,所以我不能把我还不清楚的东西应用到最小的细节上。 谢谢你的一切!
 
barma:

祝大家今天愉快。

我已经想出了如何写索引,但我对第一个机器人有问题。这似乎是合乎逻辑的,编译器没有抱怨,日志也没有错误,但测试器中的专家顾问没有工作--图表打开了,但这个图形上没有任何移动(图表没有移动)。

该想法如下。该指标产生一个买入或卖出的点(总是在蜡烛的开盘和开盘价),同时机器人的任务是在收到买入或卖出的点后,关闭相反的订单,在同一方向开立新的或修改旧的订单(停止和TP由另一个指标发出)。

如果您能提示我哪里错了,我将非常感激。

代码本身(根据其功能改变了指数名称,删除了变量的声明和错误处理部分)。

如果您只在EA中替换了指标名称,而没有在指标代码本身中替换,这些代码显示在图表的相应窗口中,那么EA将不会从它们那里接收到任何东西,也不会出现错误,因为一切都在EA中呈现,但它不会从指标中 接收信号。检查指标名称的拼写是否相同!
 
borilunad:
如果您只在EA中改变了指标的名称,而没有改变指标本身的代码,这些代码显示在图表的相应窗口中,那么EA将不会从它们那里接收到任何东西,也不会出现错误,因为一切都在EA中呈现,但它不会从指标中接收信号。检查指标名称的拼写是否相同!

谢谢你的提示,我再次检查了所有内容,没有写错。我只在论坛上的第一条信息的文本中改变了指标的名称,以使其任务明确,在专家顾问的文本中,指数的名称完全按照它们在 "指标 "文件夹中的名称来写。比如说。"3.0_figuri_2.3_rasshirenie".

此外,我选择了另一个EA(来自教程),并在iCustom函数中输入了不存在的指标名称。发生的情况如下--EA真的停止了交易(顺便说一下,这是可以理解的),但当我启动测试器时,图表从设定的开始日期移动到设定的结束日期,我应该提醒你,我的问题是,图表没有移动。

也许还有人遇到过这个问题?

 
barma:

谢谢你的提示,我再次检查了所有内容,没有写错。我只在论坛上的第一条信息的文本中改变了指标的名称,以使其任务明确,在专家顾问的文本中,指数的名称完全按照它们在 "指标 "文件夹中的名称来写。比如说。"3.0_figuri_2.3_rasshirenie".

此外,我选择了另一个EA(来自教程),并在iCustom函数中输入了不存在的指标名称。发生的情况如下--EA真的停止了交易(顺便说一下,这是可以理解的),但当我启动测试器时,图表从设定的开始日期移动到设定的结束日期,我应该提醒的是,问题是图表没有移动。

也许别人也有这样的问题。

检查指标的名称,不是在文件夹中,而是在其代码中:"短名称",因为通过它,Expert Advisor可以识别它,如果它仍然安装在适当的图表和TF上!
 
为了让指标在测试器中画出东西,它必须安装在图表上,EA本身不会画线
 
barma:

谢谢你的提示,我再次检查了所有的东西,在写作上没有错误。我只在论坛上的第一条信息的文本中改变了指标的名称,以使其任务明确,在专家顾问的文本中,指数的名称完全按照它们在 "指标 "文件夹中的名称来写。比如说。"3.0_figuri_2.3_rasshirenie".

此外,我选择了另一个EA(来自教程),并在iCustom函数中输入了不存在的指标名称。发生的情况如下--EA真的停止了交易(顺便说一下,这是可以理解的),但是当我启动测试器时,图表从设定的开始日期移动到设定的结束日期,我应该提醒你,问题是图表没有移动。

也许有人遇到过这样的问题?

周末在办公室,所以图表不会移动。