Головоломка кодирования ошибок с нулевым делением
Results 1 to 4 of 4

Thread: Головоломка кодирования ошибок с нулевым делением

  1. #1
    Вложений: 2 Привет,

    У меня есть небольшая проблема с ошибкой деления на ноль.
    Я работаю над простым советником только для практики,
    Он скомпилирован без ошибок, но когда я попробовал его в тестере egy, в журнале я получал ошибку деления на ноль.
    Я добавил Getlasterror с инструкциями для печати, где происходит ошибка, показывающая строку в коде
    Как видно из приложения
    Самую последнюю строку перед возвращением Start я положил if (GetLastError () gt; 0) Print (строка 137);
    И я оказался на 1-й линии после старта
    if (GetLastError () gt; 0) Print (строка 53); и именно здесь произошла ошибка.
    Это означает, что при возврате не было ошибок, но сразу после запуска произошла ошибка.
    Другими словами вне моего кода! Как это может случиться?
    Это проблема с тестером egy или я сделал глупость?
    заранее спасибо


    Inserted Code/ ------------------------------------------------------------------ /| HigherHi LowerLo.mq4 |/| Keith |/| http://www.metaquotes.net |/ ------------------------------------------------------------------ #property copyright Keith #property link http://www.metaquotes.net /--- input parameters extern int MagicNumber=1; extern int StopLoss = 50; extern int TakeProfit = 100; extern int DecimalPip=4; extern int MaxSlippage=5; extern double RiskPerTrade = 1; double Pip;/ ------------------------------------------------------------------ /| expert initialization function |/ ------------------------------------------------------------------ int init() {/---- /Calculate Pip decimal int decimal = 4; Pip= 1; for (int a = 1; alt;= DecimalPip; a ) { Pip = Pip*0.1; }/---- return(0); }/ ------------------------------------------------------------------ /| expert deinitialization function |/ ------------------------------------------------------------------ int deinit() {/---- /---- return(0); }/ ------------------------------------------------------------------ /| expert start function |/ ------------------------------------------------------------------ int start() {/---- if(GetLastError()gt;0) Print(Line 53); if(High#91;1#93;gt;High#91;2#93; Low#91;1#93;gt;Low#91;2#93;) /Buy Signal string Signal = Buy ; if(GetLastError()gt;0) Print(Line 57); if(High#91;1#93;lt;High#91;2#93; Low#91;1#93;lt;Low#91;2#93;) /Sell Signal Signal = Sell ; if(GetLastError()gt;0) Print(Line 61); /----------------------------------Check if a trade is already open with current pair int STicket =0; int BTicket =0; for(int x=OrdersTotal()-1;xgt;=0;x--) { OrderSelect(x, SELECT_BY_POS, MODE_TRADES); if(OrderType()lt;=OP_SELL OrderMagicNumber()==MagicNumber) STicket = OrderTicket() ; if(OrderType()lt;=OP_BUY OrderMagicNumber()==MagicNumber) BTicket = OrderTicket() ; } /-----If STicket gt;0,Sell trade already open, If BTicket gt;0 Buy trade open, If both 0, No current trade /--------------------------------Place new Trade? if(GetLastError()gt;0) Print(Line 76); if(STicket==0 BTicket==0) /No trades open { if (Signal == Buy) { double ask =MarketInfo(Symbol(),MODE_ASK);/Get current ask price double StopLoss = Ask - StopLoss*Pip; double TakeProfit = Ask TakeProfit*Pip; if(GetLastError()gt;0) Print(Line 86); /----------------Calculate LotSize and check that is more than minimum allowed by broker double Step = MarketInfo(Symbol(), MODE_LOTSTEP); double LossLot = MathAbs( Ask- StopLoss)/MarketInfo(Symbol(), MODE_TICKSIZE)*MarketInfo(Symbol(), MODE_TICKVALUE) ; int Lot = AccountEquity( )*RiskPerTrade/100LossLot/Step ; double LotSize = Lot * Step; if(LotSize lt; MarketInfo(Symbol(), MODE_MINLOT)) Alert (Lotsize is too small to trade) ; else OrderSend(Symbol(),OP_BUY,LotSize,Ask,MaxSlippage* Pip/Point,StopLoss,TakeProfit *Pip,NULL,MagicNumber,0,0); } if (Signal == Sell) { double bid =MarketInfo(Symbol(),MODE_BID);/Get current bid price StopLoss = Bid StopLoss*Pip; TakeProfit = Bid -TakeProfit*Pip; if(GetLastError()gt;0) Print(Line 106); /----------------Calculate LotSize and check that is more than minimum allowed by broker if(GetLastError()gt;0) Print(Line 108); Step = MarketInfo(Symbol(), MODE_LOTSTEP); LossLot = MathAbs( Bid- StopLoss)/MarketInfo(Symbol(), MODE_TICKSIZE)*MarketInfo(Symbol(), MODE_TICKVALUE) ; Lot = AccountEquity( )*RiskPerTrade/100LossLot/Step ; LotSize = Lot * Step; if(LotSize lt; MarketInfo(Symbol(), MODE_MINLOT)) Alert (Lotsize is too small to trade) ; else OrderSend(Symbol(),OP_SELL,LotSize,Bid,MaxSlippage *Pip/Point,StopLoss,TakeProfit *Pip,NULL,MagicNumber,0,0); } } if(GetLastError()gt;0) Print(Line 121); /---------------------Check if need to close trade if (Signal == Buy STicketgt;0) /open sell trade needs closing { OrderSelect(STicket,SELECT_BY_TICKET); OrderClose(STicket,OrderLots( ) ,MarketInfo(OrderSymbol( ),MODE_ASK) ,50,Violet); } if (Signal == Sell BTicketgt;0) /open buy trade needs closing { OrderSelect(BTicket,SELECT_BY_TICKET); OrderClose(BTicket,OrderLots( ) ,MarketInfo(OrderSymbol( ),MODE_BID) ,50,Violet); } if(GetLastError()gt;0) Print(Line 137);/---- return(0); }/ ------------------------------------------------------------------
    https://www.forex-russian.com/attach...8495297788.mq4

    https://www.forex-russian.com/crypto...notifiion.html

  2. #2
    Привет, Gumrai, есть проблемы с твоими переменными: 1. Во входах вы используете StopLoss и TakeProfit, чтобы указать расстояние в пипсах, затем вы используете точно такие же имена переменных, чтобы задать уровни на основе этих расстояний: extern int StopLoss = 50; extern int TakeProfit = 100; double StopLoss = Ask - StopLoss * Pip; double TakeProfit = Ask TakeProfit * Pip; 2. двойной запрос = MarketInfo (Symbol (), MODE_ASK); double StopLoss = Ask - StopLoss * Pip; ask - это не то же самое, что Ask - хотя, в вашем случае, это так, но тогда вам не понадобится дополнительная переменная, я думаю :-) 3. OrderSend (Symbol (), OP_BUY, LotSize, Ask, MaxSlippage * PipPoint, StopLoss, TakeProfit * Pip, NULL, MagicNumber, 0,0); Здесь вы используете множитель пипсов, который вам не нужен, если вы исправляете переменные в пункте 1. Когда я исправляю их, ошибки деления на ноль исчезают. Надеюсь это поможет,

  3. #3
    Quote Originally Posted by ;
    Привет, есть проблемы с вашими переменными: 1. Во входах вы используете StopLoss и TakeProfit, чтобы указать расстояние в пипсах, затем вы используете точно такие же имена переменных, чтобы задать уровни на основе этих расстояний: extern int StopLoss = 50; extern int TakeProfit = 100; double StopLoss = Ask - StopLoss * Pip; double TakeProfit = Ask TakeProfit * Pip; 2. двойной запрос = MarketInfo (Symbol (), MODE_ASK); double StopLoss = Ask - StopLoss * Pip; ask - это не то же самое, что Ask - хотя, в вашем случае, это так, но тогда вам не понадобится дополнительная переменная ...
    Большое вам спасибо за это
    С моей стороны глупо изменять глобальную переменную в коде. Я получил ценный урок сегодня, благодаря вам

  4. #4
    Я решаю эту проблему. 1 января 2014 года в 00:00 по Гринвичу я опубликую решение в отдельной теме. Будь там всем.

Действующие разрешения

  • Вы не можете создавать новые темы
  • Вы не можете размещать ответы
  • Вы не можете использовать вложения
  • Вы не можете редактировать ваши записи
  •  
  • BB-код - Вкл.
  • Смайлики - Вкл.
  • Код [IMG] - Вкл.
  • Код [VIDEO] - Вкл.
  • HTML-код - Выкл.
Веб-сайт использует cookies
Веб-сайт использует cookies, в настоящее время некоторые из них уже установлены. Вы можете ознакомиться с более подробной информацией об использовании нами cookies здесь. Чтобы принять условия использования cookies, пожалуйста, нажмите на кнопку справа. Если вы продолжаете пользоваться веб-сайтом, вы по умолчанию принимаете условия использования cookies.