[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 118

 
Shixan:

Добрый день.

Я написал код для открытия двух отложенных ордеров (BuyStop и SellStop) по условиям a=true и b=true и через некоторое время советник закрывает оба ордера, до появления повторного сигнала, но порой советник открывает 2 отложенных ордера в одном направлении. Почему это происходит и как избежать этого "бага"?



if (a=true && b=true)
   {        
    int OrderCount = OrdersTotal();
    if (OrderCount>1) return(0);
    ticket1=OrderSend(Symbol(), OP_BUYSTOP, getLot(), PriceOpen_Buy, slippage, PriceOpen_Sell,0,0,Green);
    Sleep(1000); 

    ticket2=OrderSend(Symbol(), OP_SELLSTOP, getLot(), PriceOpen_Sell, slippage, PriceOpen_Buy,0,0,Green);

    Sleep(1000*59*TimeFrame);

         for (int i=OrdersTotal()-1; i>=0; i--)
         {
            if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
            if (OrderType()==OP_BUYSTOP  ) OrderDelete(OrderTicket());
            if (OrderType()==OP_SELLSTOP ) OrderDelete(OrderTicket());
            if (OrderType()==OP_SELL ) OrderClose(OrderTicket(),OrderLots(),Ask,slippage);
            if (OrderType()==OP_BUY ) OrderClose(OrderTicket(),OrderLots(),Bid,slippage);
         }

return(0);  

}


Подскажите, пожалуйста.

Заранее благодарен

Ваш код не смотрел и не разбирался, но... чтобы НЕ выставлять на ОДНОМ сигнале ДВА и более ордеров, сделайте проверочку ПЕРЕД выставлением ордера: а есть ли уже выставленный ордерочек по данному сигналу? Если нету - выставляем, если есть - курим бамбук.
 
mario065:

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

Возможно ли в експерт написат,что график с фиксираный мащаб 1:1 -в настроек можно.

Если возможно,скажите как.

Заранее спосибо.

Эта библиотека может.

Раздел "3.3. Функции установки свойств графика" функция ServiceSetScaleFix1To1().

Библиотека работает только с русской и английской локализациями. Возможно в Вашей тоже будет.

 
Здравствуйте, ответьте, а почему в новом build 451 в MetaEditor  когда компилишь, второй файл ex 4 не появляется в папке experts рядом с файлом mq 4
 

 Вот функция открытия ордера:

//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell(double price)
{
   int ticket = -1;
   double SL = OrderOpenPrice() + i_sl * pt;
   double TP = OrderOpenPrice() - i_tp * pt;
   
   if (price < Bid)
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(price), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
   {
      if (i_sl > 0 && OrderStopLoss() == 0)
      {
         if (!OrderModify(ticket, OrderOpenPrice(), ND(SL), ND(TP), 0, Red))
         {
            Print ("Ошибка установки первичного стопа для шортов ", OrderType(), " - ", GetLastError());
            Print("pt = ", pt);
            Print("Ask = ", Ask);
            Print("Bid = ", Bid);
            Print("SL_s = ", OrderOpenPrice() + i_sl * pt);
            Print("TP_s = ", OrderOpenPrice() - i_tp * pt);
         }
      }
   }
       return (true);
}

 Вот распринтовка параметров:

2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: TP_s = 1.4499
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: SL_s = 1.4519
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Bid = 1.4513
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ask = 1.4515
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: pt = 0.0001
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ошибка установки первичного стопа для шортов 5 - 4051
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: OrderModify error 4051
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: invalid takeprofit for OrderModify function
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: open #1 sell stop 0.10 EURUSD at 1.45091 ok

 Здесь явно видно что цена ТП и СЛ находятся ниже и выше соответственно аска и бида, т.е. всё верно. Но почему-то происходит ошибка модификации по причине неверное стопа. Как так? 

 
hoz:

 Вот функция открытия ордера:

 Вот распринтовка параметров:

 Здесь явно видно что цена ТП и СЛ находятся ниже и выше соответственно аска и бида, т.е. всё верно. Но почему-то происходит ошибка модификации по причине неверное стопа. Как так? 

А вы вообще читаете то, на что ругань идёт?

ERR_INVALID_FUNCTION_PARAMVALUE 4051 Недопустимое значение параметра функции

Смотрите параметры, передаваемые в вызываемую функцию.Вот когда совсем ничего не понятно будет, тогда всем миром разбираться будем-с...

ЗЫ. При выставлении отложенного ордера строка

if (price < Bid)

не совсем уместна. Нужно проверять на соответствие минимально-разрешённой дистанции, заданной в MarketInfo(Symbol(), MODE_STOPLEVEL). Первое, что сразу же бросилось в глаза.

Второе - распечатайте цену, на которой установлен ордерочек. Стоп и Тейк должны располагаться не относительно Аска с Бидом, а относительно цены установки ордера

 
Zhunko:

Эта библиотека может.

Раздел "3.3. Функции установки свойств графика" функция ServiceSetScaleFix1To1().

Библиотека работает только с русской и английской локализациями. Возможно в Вашей тоже будет.

Спосибо Zhunko.
 
artmedia70:

А вы вообще читаете то, на что ругань идёт?

ERR_INVALID_FUNCTION_PARAMVALUE 4051 Недопустимое значение параметра функции

Смотрите параметры, передаваемые в вызываемую функцию.Вот когда совсем ничего не понятно будет, тогда всем миром разбираться будем-с...


 Конечно читаю, потому и интересно стало. вот распринтовал все входные параметры.

Вот что вышло:

bool OpenSell(double price)
{
   int ticket = -1;
   double SL = OrderOpenPrice() + i_sl * pt;
   double TP = OrderOpenPrice() - i_tp * pt;
   
   if (price < Bid)
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(price), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
   {
      if (i_sl > 0 && OrderStopLoss() == 0)
      {
         Print("ND(price) = ", DoubleToStr(ND(price),Digits));
         Print("ND(SL) = ", DoubleToStr(ND(SL),Digits));
         Print("ND(TP) = ", DoubleToStr(ND(TP),Digits));
         Print("ND(OOP) = ", DoubleToStr(ND(OrderOpenPrice()),Digits));
         if (!OrderModify(ticket, ND(OrderOpenPrice()), ND(SL), ND(TP), 0, Red))
         {
            Print ("Ошибка установки первичного стопа для шортов ", OrderType(), " - ", GetLastError());
            Print("pt = ", pt);
            Print("Ask = ", Ask);
            Print("Bid = ", Bid);
            Print("SL_s = ", OrderOpenPrice() + i_sl * pt);
            Print("TP_s = ", OrderOpenPrice() - i_tp * pt);
         }
      }
   }
       return (true);
}

В журнале вот что:

2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: TP_s = 1.4485
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: SL_s = 1.4505
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Bid = 1.4496
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ask = 1.4497
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: pt = 0.0001
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ошибка установки первичного стопа для шортов 5 - 4051
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: OrderModify error 4051
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: invalid takeprofit for OrderModify function
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(OOP) = 1.44946
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(TP) = -0.00100
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(SL) = 0.00100
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(price) = 1.44946
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: open #4 sell stop 0.10 EURUSD at 1.44946 ok

 Некоторые ордера модифицируются, а некоторые нет. Значения ND(TP), ND(SL) в самом начале вообще вернулись абы какие. Почему?

 Функция нормализации, кстати вот моя:

 

//+-------------------------------------------------------------------------------------+
//| Функция нормализации                                                                |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
  return (NormalizeDouble(A, Digits));
}
 
artmedia70:

А вы вообще читаете то, на что ругань идёт?

ERR_INVALID_FUNCTION_PARAMVALUE 4051 Недопустимое значение параметра функции

Смотрите параметры, передаваемые в вызываемую функцию.Вот когда совсем ничего не понятно будет, тогда всем миром разбираться будем-с...

ЗЫ. При выставлении отложенного ордера строка

if (price < Bid)

 

не совсем уместна. Нужно проверять на соответствие минимально-разрешённой дистанции, заданной в MarketInfo(Symbol(), MODE_STOPLEVEL). Первое, что сразу же бросилось в глаза.



Обычно, подобные проверки я встречал для модификации ордеров а не при открытии. Ведь если при установке цены отложки на байстоп цена ниже Аска это будет ошибка, это я уже проходил. А если 10пп. стоп то он явно выше значение стоплевела. Я ж не на тиках торгую :)
 
artmedia70:


Второе - распечатайте цену, на которой установлен ордерочек. Стоп и Тейк должны располагаться не относительно Аска с Бидом, а относительно цены установки ордера



 Я так понимаю, это для модификации? Ведь при открытии нам важен БИД и АСК. Постом выше я всё распринтовал.
 

Добрый день,

 

Хочу заставить эксперта работать на нескольких окнах одновременно. Но для каждого инструмента может быть открытым только один ордер. Поэтому сейчас стоит условие:

int total =  OrdersTotal();

if (total<1) {блок анализа и открытия позы} else {блок анализа и закрытия позы }

 

теперь, если на двух инструментах одновременно, то при открытии на одном , будет заблокирована работа на другом. Поэтому я сочинил нечто подобное:

 int total = OrdersTotal();

 int cnt;     

 if(total>0)
      {
       for(cnt=0;cnt<total;cnt++) 
         {
          OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
            if(OrderSymbol()==Symbol())
               {
                Symbol_FLAG = true;
               }
         }
      }  

 if(total<1 || total>0  && Symbol_FLAG == false) {блок анализа и открытия ntпозы}...

 

но на тестере не работает...  

 

Может подскажете, возможно я затеял что-то нереализуемое? 

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