Помогите найти ошибку в коде - страница 2

 
khorosh:
А на каком таймфрейме вы проверяете эксперт?


на H4
 
khodakvv:


на H4


Меня смущают переходы по времени из datetime в int и наоборот. Может там ошибка ?
 
khodakvv:


на H4

Получается, что после открытия первого ордера следующий откроется только через 10 дней? Вы хотели получить именно такой результат?

 
khodakvv:


Это не принципиально. Искать нужно во времени

ничего себе "не принципиально". вам совершенно правильно указали на принципиальную ошибку
 
khodakvv:


Верхний вариант не будет работать правильно. Если условие if (OrderMagicNumber()==magic && OrderType()== type) ложно, то дальше идет брейк и мы можем не попасть на желаемый ордер

вы может быть удивитесь, но ваш ответ неверный. в верхнем варианте брейк пойдёт в любом случае
 

по времени тоже косяк - поиск по времени открытия ордров и присвоение значений переменных timeopenbuy и timeopensell

for(i=1; i<=OrdersTotal(); i++)
{
if (OrderSelect(i-1,SELECT_BY_POS))
{
if (OrderSymbol()!=Symbol())continue;
if (OrderMagicNumber()!= magic)continue;
if (OrderType()== 0)
{
tikbuy = OrderTicket();
timeopenbuy = OrderOpenTime();
}
if (OrderType()== 1)
{
tiksell = OrderTicket();
timeopensell = OrderOpenTime();
}
}
}

надо производить не только в функции init(), которая запускается только 1 раз при прицеплении советника к графику, но и в start(), которая отрабатывает на каждом тике, перед проверкой условий на открытие новых ордеров

или я не прав?

 
Vinin:

Если есть логическая в одной функции, то она может быть и в других.

На вскидку вижу явные недочеты в логике:

1. вот вход на покупку:

//+---------------------------вход-на-бай---------------------------------------+ 
while(true)
     {
       if (buys)break;
       if (TimeCurrent()-timeopenbuy < 60*Period())break;
       if (lips1<=jaws1)break;
       if (lips2>jaws2)break;
       if (iCustom(NULL,0,"Herst3",0,1)<=herstnumber)break;
                              
                               
                              tikbuy = OPENBUY(Lots,slippage,Bid-StopLoss*Point,Ask+TakeProfit*Point,magic);
                              timeopenbuy = TimeCurrent();
                              return;    
                           
  }
//+------------------------------------------------------------------+ 

Вот функция открытия в длинную позицию:

int OPENBUY (double Lots,int slippage,double StopLoss,double TakeProfit1, int magic)
   {
    while (true)   
        
          {
             RefreshRates();                        // Обновление данных
             Alert("Попытка открыть Buy. Ожидание ответа..");
             int Ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,StopLoss,TakeProfit1,0,magic,0,Green);           
             if (Ticket1 > 0)
                {
                Alert ("Открыт ордер Buy ",Ticket1);
                break;
                } 
                else if (Fun_Error(GetLastError())==1) 
                        {
                        continue;
                        }
                     else 
                        {
                        return;// ?????????????????????????????
                        }     
           }
                
    
    return (Ticket1);           
 }

Видно, что открытие ордера не всегда является результатом работы этой функции. Например, если обработчик ошибок возвращает не единицу OPENBUY вообще непонятно что возвращает.

Но в первом цикле, без анализа результата работы OPENBUY, просто устанавливается переменная timeopenbuy так, как будто ордер всегда открыт после работы этой функции.

2. Если исполнение Маркет - работать не будет ....

3. решение для выставления одного ордера на бар проблемное ....

Дальше даже смотреть нет смысла...

 
khorosh:

Получается, что после открытия первого ордера следующий откроется только через 10 дней? Вы хотели получить именно такой результат?






Почему чепез 10 дней ? Через интервал периода
 
abolk:

ничего себе "не принципиально". вам совершенно правильно указали на принципиальную ошибку


Признаю, функция ордерчек была неправильной, но это не решило проблему
 
khodakvv:


Признаю, функция ордерчек была неправильной, но это не решило проблему


может вам лучше взять уроки по обучению программированию?
ваш код настолько "сырой" и богат на логические ошибки - что тут одно слово "безнадёга" на данном этапе

если хотите научиться - именно научить себя - писать программы - да ещё и за деньги, то мой вам совет - станьте активным участником-подсказчиком в ветке "вопросы новичков" https://www.mql5.com/ru/forum/131277/page343 - и школа хорошая и опыт появится

а так вы просто морочите голову заказчикам своим "профессиональным" исполнением

Причина обращения: