Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 173

 
Artyom Trishkin:

Вас никто не называл "лошара", зря вы так. Но и 4-6 строк кода тоже, знаете-ли вызывают недоумение - ведь раз человек чему-то учится, то должен уже что-то пробовать, что-то уже пытался написать, и явно уже видит, что в 4-6 строчек не уместиться.

Покажите что вы пытались сделать - попробуем понять.

Могу предложить альтернативный, упрощённый вариант - не искать по тикам пересечение цены некоего уровня, а искать его по МА(1) - тогда МАшка на баре 1 и МАшка на баре 0 будут служить вам индикатором пересечения нужного вам уровня.


Простите что долго не отвечал. Я рад что получилось просто недоумение, я вспылил. А что касается моего вопроса, у меня получилось написать код, что бы открыть обычный ордер когда он достиг цены и что бы в последствии пересекая эту цену он не открывался вновь. Но я это сделал так:
double b = 5;
int start()
double bid = Bid;
if (bid==0.7777 && b==5)
{
b=b+1;
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0,0,0);
}

return;

Я уже понял, что это "детсадовский" метод и с ним работать нельзя, потому что слишком много нюансов и вообще не практично. Можете сказать в какой именно ситуации код не будет работать или как можно изменить его что бы он был работоспособным? P.s. "искать его по МА(1) - тогда МАшка на баре 1 и МАшка на баре 0 будут служить вам индикатором пересечения нужного вам уровня. " Как то не очень понимаю о чем речь, так что это пока можно отложить, пока не изучу больше материала          


 
maxon777:

Простите что долго не отвечал. Я рад что получилось просто недоумение, я вспылил. А что касается моего вопроса, у меня получилось написать код, что бы открыть обычный ордер когда он достиг цены и что бы в последствии пересекая эту цену он не открывался вновь. Но я это сделал так:
double b = 5;
int start()
double bid = Bid;
if (bid==0.7777 && b==5)
{
b=b+1;
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0,0,0);
}

return;

Я уже понял, что это "детсадовский" метод и с ним работать нельзя, потому что слишком много нюансов и вообще не практично. Можете сказать в какой именно ситуации код не будет работать или как можно изменить его что бы он был работоспособным? P.s. "искать его по МА(1) - тогда МАшка на баре 1 и МАшка на баре 0 будут служить вам индикатором пересечения нужного вам уровня. " Как то не очень понимаю о чем речь, так что это пока можно отложить, пока не изучу больше материала          



Сравнение на равенство двух чисел, тип double, это не очень хорошая операция.

как то,   NormalizeDouble (А - Б , 5)==0, так наверное.   

 

Всем добрый вечер!

Прошу помощи, не могу найти ошибку в коде.

Мне нужно определить был ли профит по  моей паре, если был то не продолжать торговлю и закрыть советник, если не был то

выставляем отложенник.

Проблема в том, что при запуске советника, он тут же удаляется, т.е. срабатывает  ExpertRemove(), хотя профита то еще не было.

Ниже часть кода:

void OnTick()

  {

  

   if (TakeProfit ()>0)

      {

       ExpertRemove();

      }        

   if (TakeProfit ()<=0)

   {

   

   здесь выставляем отложку

   

   }

  }

//+------------------------------------------------------------------+

////////Ищем, были ли здесь отдера закрытые с профитом!!!!!!!!

int TakeProfit ()

{

  int count = 0;

  for(int i=OrdersHistoryTotal()-1; i>=0; i--)

    {

    if (OrderSelect (i,SELECT_BY_POS,MODE_HISTORY) == true && OrderMagicNumber() == Magic && OrderSymbol () == Symbol () && OrderProfit()>0.0)

        {

        count ++;

        }

    }

 return (count);   




 
yaaarik777:

Всем добрый вечер!

Прошу помощи, не могу найти ошибку в коде.

Мне нужно определить был ли профит по  моей паре, если был то не продолжать торговлю и закрыть советник, если не был то

выставляем отложенник.

Проблема в том, что при запуске советника, он тут же удаляется, т.е. срабатывает  ExpertRemove(), хотя профита то еще не было.

Ниже часть кода:

////////Ищем, были ли здесь ... закрытые с профитом!!!!!!!!

int TakeProfit ()

{

  int count = 0;

  for(int i=OrdersHistoryTotal()-1; i>=0; i--)

    {

    if (OrderSelect (i,SELECT_BY_POS,MODE_HISTORY) == true && OrderMagicNumber() == Magic && OrderSymbol () == Symbol () && OrderProfit()>0.0)

        {

        count ++;

        }

    }

 return (count);   

Что вы ищите этим кодом?

Он смотрит профит по всей истории, а не конкретно закрытой позиции, и если по всей истории плюс, то вы и получите при любом раскладе на выходе  OrderProfit()>0

 
Vitaly Muzichenko:

Что вы ищите этим кодом?

Он смотрит профит по всей истории, а не конкретно закрытой позиции, и если по всей истории плюс, то вы и получите при любом раскладе на выходе  OrderProfit()>0


а как сделать чтобы искал не по всей, а по закрытым от момента работы советника?

я не догоняю.

Спасибо за помощь.

 
yaaarik777:


а как сделать чтобы искал не по всей, а по закрытым от момента работы советника?

я не догоняю.

Спасибо за помощь.

Найти последнюю закрытую позицию, которая была закрыта позже времени запуска советника, либо последнюю закрытую в этот день, и поглядеть её профит: OrderProfit()+OrderComission()+OrderSwap()
 
yaaarik777:


а как сделать чтобы искал не по всей, а по закрытым от момента работы советника?

я не догоняю.

Спасибо за помощь.


Как вы определяете момент работы советника?

предлагаю так;

double TakeProfit ()
{
 datetime момент работы советника=0;
 double p=0;
  for(int i=OrdersHistoryTotal()-1; i>=0; i--){
    if (OrderSelect (i,SELECT_BY_POS,MODE_HISTORY)){
       if (OrderMagicNumber() == Magic){
          if(OrderSymbol () == Symbol ()){
            if(момент работы советника<OrderCloseTime()){
               p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
 return(p);
}
   
 
Artyom Trishkin:
Найти последнюю закрытую позицию, которая была закрыта позже времени запуска советника, либо последнюю закрытую в этот день, и поглядеть её профит: OrderProfit()+OrderComission()+OrderSwap()


зачем позже времени запуска советника? он же у меня итак ищет все закрытые позиции.

нужно чтобы он искал от начала работы советника, а не до.

 
yaaarik777:


зачем позже времени запуска советника? он же у меня итак ищет все закрытые позиции.

нужно чтобы он искал от начала работы советника, а не до.


Если немножечко подумать, то "от начала и дальше" будет именно позже времени запуска советника ;)

Не ленитесь пользоваться междуушным органом.

 

Здравствуйте.

Помогите, пожалуйста, отобразить в виде гистограммы, данные из файла.

В файле "file.txt" дате, соответствует некое число.

Данные из файла получаю и вывожу на принт,