Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 801

 

Не пойму, в чем проблема? 

 

int start() 

{

bool i;

int ticket;

double Pricem;

datetime Timen; 

string Symb=Symbol();

ticket=OrderSend(Symb,OP_SELL,0.1,Bid,3,Ask+4*Point,Ask-12*Point);

i=OrderSelect(0,SELECT_BY_POS);

while(true)

{

RefreshRates();

Timen=OrderCloseTime();

  if(Timen>0)

   {

     Pricem=OrderClosePrice();

     Alert(Pricem);

     Alert("ордер закрылся");

     Sleep(30000);

 }

 Sleep(10);

 }

return;                              

}


Должно появиться сообщение о закрытии. Ордер открывается, добирается до стопа, закрывается и все! Где ошибка?
 

Решаю задачу закрытия всех открытых графиков средствами MQL4. Есть 3 открытых графика с разными валютными парами и такой код скрипта:

   for (int i=1;i<=3;i++) {
      long current=ChartID();
      Print("итерация цикла: ",i,", идентификатор текущего графика ",current);
      bool result=ChartClose(current);
      if(result)Print("окно успешно закрыто");
      else Print("не удалось закрыть окно с идентификатором: ", current);
   }

 При запуске скрипта закрывается лишь один из трех графиков и вот принты из лога:

AUDUSD,H1: итерация цикла: 1, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто
AUDUSD,H1: итерация цикла: 2, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто
AUDUSD,H1: итерация цикла: 3, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто

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

1. После закрытия первого графика функция ChartID возвращает идентификатор не текущего, а закрытого графика

2. Функция ChartClose() во 2 и 3 итерациях возвращает true, то есть она как бы успешно закрывает уже закрытое окно...

Кто-нить подскажет где баг и как решить эту задачу? 

 
CJIeCaPb:

Не пойму, в чем проблема? 

 Должно появиться сообщение о закрытии. Ордер открывается, добирается до стопа, закрывается и все! Где ошибка?

Полагаю что OrderSelect() должен быть внутри цикла while, ну и к тому же номер позиции будет некорректен, т.к. после закрытия он станет другим - в этом случае лучше выбирать по тикету
 
tuner:
Полагаю что OrderSelect() должен быть внутри цикла while, ну и к тому же номер позиции будет некорректен, т.к. после закрытия он станет другим - в этом случае лучше выбирать по тикету
ура, сработало! спс
 
tuner:

Решаю задачу закрытия всех открытых графиков средствами MQL4. Есть 3 открытых графика с разными валютными парами и такой код скрипта:

 При запуске скрипта закрывается лишь один из трех графиков и вот принты из лога:

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

1. После закрытия первого графика функция ChartID возвращает идентификатор не текущего, а закрытого графика

2. Функция ChartClose() во 2 и 3 итерациях возвращает true, то есть она как бы успешно закрывает уже закрытое окно...

Кто-нить подскажет где баг и как решить эту задачу? 

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(currChart<0) break;  
      prevChart=currChart;
      ChartClose(currChart);
      i++;
     }
     ChartClose(ChartFirst());
  }
//+------------------------------------------------------------------+
 

pako, иногда срабатывает, иногда нет, не пойму почему... выдает ошибку:

2014.12.11 17:52:12.456 Access violation read to 0x09295000 in 'C:\.....................ex4'

Может связано с тем что пытается закрыть график, на который накинут скрипт? 

 PS работает корректно если накинуть скрипт на самый первый слева график. А если на любой другой, то выходит ошибка 

 
tuner:

pako, иногда срабатывает, иногда нет, не пойму почему... выдает ошибку:

2014.12.11 17:52:12.456 Access violation read to 0x09295000 in 'C:\.....................ex4'

Может связано с тем что пытается закрыть график, на который накинут скрипт? 

 PS работает корректно если накинуть скрипт на самый первый слева график. А если на любой другой, то выходит ошибка 

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(currChart<0) break; 
      ChartClose(currChart); 
      prevChart=currChart;
      i++;
     }
     ChartClose(ChartFirst());
  }
//+------------------------------------------------------------------+
 

ребята помогите разобраться 

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

еновые переводит все нормально ,а вот на пяти знаках переводит только в ноль хотя должен +1 пункт ,но самое интересное ,что если я его сразу устанавливаю на пять знаков то  он работает нормально

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

Спасибо огромное .   

    }

 //==================================================================================================

 // функция перевода ордеров стоп лоса в без убыток по всем открытым ордерам

 //==================================================================================================

 if(_Simbol==false)//если false то по всем ордерам открытым 

 { 

   for(int i=0;i<OrdersTotal();i++)//цикл перебора ордеров

     {

       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))//будем искать следующие

         {

           if(OrderType()==OP_BUY) //если тип бай

            {

             double  bid=MarketInfo(OrderSymbol(),MODE_BID);//последний известный бид инструмента

             double  point=MarketInfo(OrderSymbol(),MODE_POINT);//чему равен пункт инструмента

             

               if(OrderStopLoss()<OrderOpenPrice())//если стоп лос меньше цены открытия

                {

                  if(bid-Dist_Perivoda*point>OrderOpenPrice())//бид-профит*пункт больше цены открытия

                   {//модифицируем стоп лос

 bool ord_modifik=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+NormalizeDouble(Level_Zahiti*point,Digits),OrderTakeProfit(),0,clrNONE);

              if(!ord_modifik)//если не получилось

              Comment(GetLastError());//номер ошибки в угол

                   }

                   

                }

            }

            if(OrderType()==OP_SELL)//если тип селл

            {

              double ask=MarketInfo(OrderSymbol(),MODE_ASK);//последний известный аск инструмента

              double  point=MarketInfo(OrderSymbol(),MODE_POINT);//чему равен пункт инструмента

              

              if(OrderStopLoss()==0||OrderStopLoss()>OrderOpenPrice())//если стоп лос больше цены открытия или равен нолю

              {

                if(ask+Dist_Perivoda*point<OrderOpenPrice())//аск +профит*пункт меньше цены открытия

                  {//модифицируем стоп лос

  bool ord_modifik=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-NormalizeDouble(Level_Zahiti*point,Digits),OrderTakeProfit(),0,clrNONE);

                  if(!ord_modifik)//если не получилось

                  Comment(GetLastError());//номер ошибки в  угол

                  }

                }

             } 

          }

       }

    }

  

 
pako:

благодарю за код, вобщем суть понятна, хотя все равно ошибку иногда выдает.

Поэкспериментировал с функциями, которые показывают ID чартов. Что такое ChartFirst() из документации совершенно непонятно, интерпретировать можно как угодно - то ли имеется в виду первый по порядку слева график, то ли первый открытый из всех открытых (по времени), то ли вообще самый первый из когда-либо открытых в терминале (вероятность что он сейчас открыт равна практически нулю, поэтому закрывать его нет смысла). Больше склоняюсь к последней версии, т.к. ни разу не видел чтобы эта функция возвращала ID чарта, который открыт на данный момент.

 
tuner:

благодарю за код, вобщем суть понятна, хотя все равно ошибку иногда выдает.

Поэкспериментировал с функциями, которые показывают ID чартов. Что такое ChartFirst() из документации совершенно непонятно, интерпретировать можно как угодно - то ли имеется в виду первый по порядку слева график, то ли первый открытый из всех открытых (по времени), то ли вообще самый первый из когда-либо открытых в терминале (вероятность что он сейчас открыт равна практически нулю, поэтому закрывать его нет смысла). Больше склоняюсь к последней версии, т.к. ни разу не видел чтобы эта функция возвращала ID чарта, который открыт на данный момент.

ChartFirst

Возвращает идентификатор первого графика клиентского терминала.

я понимаю, что это самый левый график