[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 359

 

伙计们,你们能否提供建议。

当在MT4交付的货币对中包含的标准指标上测试顾问时 - 没有问题 - 一切都按照交易算法工作。

在对金属(如白银和黄金)进行测试时,订单没有被打开,在策略测试器日志文件中,它们被除以零。

我有相同的输入参数,这个五位数的经纪公司(forex4yu)的历史记录已经上传,用于测试的工具。

可能的原因是什么? 我不想把我的EA送给心灵感应者。我根据书中的版本 亲自编写了专家顾问。

 
Roman.:

伙计们,你们能否提供建议。

当在MT4交付的货币对中包含的标准指标上测试顾问时 - 没有问题 - 一切都按照交易算法工作。

在对金属,如白银和黄金进行测试时,订单没有被打开,在策略测试器日志中,他们写的是零分。

我有相同的输入参数,这个五位数的经纪公司(forex4yu)的历史记录已经上传,用于测试的工具。

可能的原因是什么? 我不想把我的EA送给心灵感应者。我根据书中的版本 亲自编写了专家顾问。

每当除以一个变量时,你必须首先检查它是否不等于零。
 
Roman.:

伙计们,你们能否提供建议。

当在MT4交付的货币对中包含的标准指标上测试顾问时 - 没有问题 - 一切都按照交易算法工作。

在对金属,如白银和黄金进行测试时,订单没有被打开,在策略测试器日志中,他们写的是零分。

我有相同的输入参数,这个五位数的经纪公司(forex4yu)的历史记录已经上传,用于测试的工具。

可能的原因是什么? 我不想把我的EA送给心灵感应者。我根据书中的版本 亲自编写了专家顾问。


你应该看到代码。一般来说,你可以(在Notepad++中)自动标记代码中出现除号的所有地方,看看在某些情况下是否真的出现除以0。
 
drknn:

我很想看看这段代码。一般来说,你可以(在Notepad++中)自动标记代码中出现除号的所有地方,并检查在某些情况下是否真的发生除以0。


是的,我已经在看拆包后达到的指纹,那里一切正常......

在金属的体积正常化功能中,有这样的错误(除以零),现在它不存在了,还有另一个131 -不正确的体积,虽然设置明显=0,01手,我看在一般...

对于货币来说,这个音量正常化功能可以正常工作....也许它们有一个共同点(对于金属和货币)?

//--------------------------------------------------------------------
// Lot_MM.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления количества лотов.
// Глобальные переменные:
// double Lots_New - количество лотов для новых ордеров (вычисляется)
// double Lots     - желаемое количество лотов, заданное пользовател.
// double  MaksRisk  - процент риска
// Возвращаемые значения:
// true  - если средств хватает на минимальный лот
// false - если средств не хватает на минимальный лот
//--------------------------------------------------------------- 2 --
bool Lot_MM()                            // Позовательская ф-ия
  {
   int time, ticket;                  // Наибольшее время открытия и номер ордера
   double orderLots;                  // Lots   
   double orderProfit;                // Profit
   double Price;                      // Цена открытия рыночного ордера
   double SL;                         // Значение StopLoss ордера
   double  TP;                        // Значение TakeProfit ордера
   string Symb   =Symbol();                    // Финансовый инструм.
   double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Размер свободных средств, необходимых для открытия 1 лота
   double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер. лотов
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен размера
   double Free   =AccountFreeMargin();         // Свободные средства
   double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
   

//--------------------------------------------------------------- 3 --
   if (Lots>0)                                 // Лоты заданы явно..
{                                              // ..проверим это
      double Money=Lots*One_Lot;               // Стоимость открываемого ордера   
      if(Money<=AccountFreeMargin())             // Средств хватает..     
         {  
          Lots_New=Lots;                           // ..принимаем заданное
            // else                                     // Если не хватает..
            // Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов 
            Print("Функция Lot_MM: Lots_New  = ", Lots_New);    
...
...
...
...
 // ---------НОРМАЛИЗУЕМ НОВЫЕ РАСЧЕТНЫЕ ЛОТЫ И ОТКРЫВАЕМ ОЧЕРЕДНУЮ ПОЗИЦИЮ...            
                    Lots_New = NormalizeLots(Lots_New);  
   return(true);                               // Выход из польз. ф-ии
  }
//--------------------------------------------------------------- 6 --

//+------------------------------------------------------------------+
//| Нормализация лота                                                |
//+------------------------------------------------------------------+

double NormalizeLots(double lot)
{
   double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   double lots = NormalizeDouble(lot / lotStep, 0) * lotStep;   
   lots = MathMax(lots, MarketInfo(Symbol(), MODE_MINLOT));
   lots = MathMin(lots, MarketInfo(Symbol(), MODE_MAXLOT));   
   return (lots);
}
 

我不明白:它打印了顶线,但订单没有打开,出现错误131 - 错误的量,我已经设置了0.1和0.01...

 Print ("Функция открытия ордера с рынка - продажа: Teeth = ",  NormalizeDouble(Teeth,Digits), " upfractal = ", upfractal," Цена Bid = ", NormalizeDouble(Bid,Digits), " Lots_New = ", NormalizeDouble(Lots_New,2));                
Ticket=OrderSend(Symbol(),1,0.01,Bid,50,0,0,"Antiunity-start",Magic,0,Red);    

 
Techno:
每当除以一个变量时,你必须首先检查它是否不等于零。

谢谢,我以后会记住的。只是这次我采取了一个现成的音量正常化功能。
 

到目前为止没有用...写下了同样的错误...

 Print ("Функция открытия ордера с рынка - продажа: Teeth = ",  NormalizeDouble(Teeth,Digits), " upfractal = ", upfractal," Цена Bid = ", NormalizeDouble(Bid,Digits), " Lots_New = ", NormalizeDouble(Lots_New,2));                
          Ticket=OrderSend(Symbol(),1,Lots_New,Bid,50,0,0,"Antiunity-start",Magic,0,Red);            
          Print ("Функция открытия ордера с рынка - продажа: старт");      

我在测试器中的账户上开了一个黄金头寸,有10,000和0.01及0.1手--但没有结果。

也许有人遇到了类似的问题?一个提示,请...

 

将我的批量检查功能添加到你的自定义子程序中。并在每个OrderSend()之前调用它。在我的Dll中,四舍五入是根据数学定律进行的:如果四舍五入的数字以小数部分 结尾,数字>=5,那么就向上舍入。如果<=4,那么就向下取整。据我所知,由于某些原因,编程语言在这方面有问题--我不得不自己编写dll代码。基本上,代码非常简单,但我在网上搜索了很多,才找到最佳解决方案。你需要该dll的源代码吗?

// ============ ProverkaLota() =====================================================================
// функция принимает нормализует лот ордера
//-----------------------------------------------------
double ProverkaLota(double LotOrdera,string SMB){
  double SMB_MinLot=MarketInfo(SMB,MODE_MINLOT);
  double SMB_MaxLot=MarketInfo(SMB,MODE_MAXLOT);
  double SMB_LotStep=MarketInfo(SMB,MODE_LOTSTEP);
  LotOrdera=OkruglenieDoSotykh(LotOrdera);// округляем до сотых

 if(SMB_LotStep==0.1){// округляем до десятых
   LotOrdera/=10;
   LotOrdera=OkruglenieDoSotykh(LotOrdera);
   LotOrdera*=10;// возвращаем дробную часть ордера на место
 }
 if(LotOrdera<SMB_MinLot){
   LotOrdera=SMB_MinLot;
 }
 if(LotOrdera>SMB_MaxLot){
   LotOrdera=SMB_MaxLot;
 }
 return(LotOrdera);
}
// =================================================================================================
附加的文件:
basic_dll_1.zip  190 kb
 
drknn:

将我的批量检查功能添加到你的自定义子程序中。并在每个OrderSend()之前调用它。在我的Dll中,四舍五入是根据数学定律进行的:如果四舍五入的数字以小数部分结尾,数字>=5,那么就向上舍入。如果<=4,那么就向下取整。据我所知,由于某些原因,编程语言在这方面有问题--我不得不自己编写dll代码。基本上,代码非常简单,但我在网上搜索了很多,才找到最佳解决方案。你需要该dll的源代码吗?


是的,谢谢。
 
Roman.:

是的,谢谢你。


DLL语言:Delphi

library basic;

uses
  SysUtils,Windows,Classes,Dialogs;

{$R *.res}

{Обычно в своих программах не требуется менять модель вызова, delphi по
  умолчанию использует более быстрый fastcall, но при импорте функций из других
  библиотек нужно указывать stdcall (или cdecl для сишных библиотек типа
  msvcrt.dll), иначе просто не будет работать, или будет, но неверно}

// --------- Арифметическое округление до сотых ---------
function OkruglenieDoSotykh(d_ChtoOkruglit:Double):Double; stdcall;
var
  d_Rezult:Double;

begin
  d_Rezult:=Int(d_ChtoOkruglit*100+0.55);
  OkruglenieDoSotykh:=d_Rezult/100;
end;

exports OkruglenieDoSotykh;

begin
end.