Ответ
 
Опции темы
Старый 13.12.2012, 14:49   #681 (permalink)
Заблокирован
За второе место в конкурсе 

 
Аватар для eevviill
 
Регистрация: 30.07.2009
Сообщений: 5,474
Репутация: 9022
eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill
Сказал(а) спасибо: 13,680
Поблагодарили 9,022 раз(а) в 3,179 сообщениях
Поинты: 1105
Отправить сообщение для eevviill с помощью Skype™
Сообщение от hoz Посмотреть сообщение
Я переписал эксперт, и теперь у него не всегда при модификации ставятся стопы(для есн. типа счетов).

...
Может кто подсказать где ошибка? По логике всё верно как я вижу.
А sl tp у тебя постоянно 0?
По идеи он у тебя только сл и тп ставит на 0. Тоесть если у ордера есть стопы, то он их на 0 выставляет.
eevviill вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 13.12.2012, 14:52   #682 (permalink)
Заблокирован
За второе место в конкурсе 

 
Аватар для eevviill
 
Регистрация: 30.07.2009
Сообщений: 5,474
Репутация: 9022
eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill
Сказал(а) спасибо: 13,680
Поблагодарили 9,022 раз(а) в 3,179 сообщениях
Поинты: 1105
Отправить сообщение для eevviill с помощью Skype™
Рекомендую тебе модифицировать ордер сразу после открытия. Таким образом не надо будет проверять стопы на каждом тике.

Скрытый текст

PHP код:
int ticket_op=-1;
 
 while(
IsTradeContextBusy()) Sleep(1000);
 
ticket_op=OrderSend(Symbol(),OP_BUYLIMIT,NormalizeDouble(Lot_*K_Lot+PlusLot,Lot_digits),NormalizeDouble(price_b-Step*point,Digits),slippage,0,0,comment,mag,0,Green);
 
Sleep(500);
 if(
ticket_op>-1) {OrderSelect(ticket_op,SELECT_BY_TICKET); OrderModify(ticket_op,OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(price_b-Step*point+prof*point,Digits),CLR_NONE);}                    
 } 
[свернуть]

Последний раз редактировалось NSerega; 13.12.2012 в 16:18.
eevviill вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 13.12.2012, 15:11   #683 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Сообщение от eevviill Посмотреть сообщение
А sl tp у тебя постоянно 0?
По идеи он у тебя только сл и тп ставит на 0. Тоесть если у ордера есть стопы, то он их на 0 выставляет.
С чего бы то это вдруг на ноль? Если стопы или тейки есть т.е. входные внешние параметры i_sl или i_tp не равны нулям, то стопы будут, так как сы их получаем(участок кода ниже) привожу
Ведь у нас (если для шорта):

Скрытый текст

PHP код:
if(g_type == OP_SELL)
      {
        if(
i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           
sl NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        
if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           
tp NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      

[свернуть]



Значение sl и tp вычисляется, только если i_sl и i_tp не равны нулям.

Последний раз редактировалось NSerega; 13.12.2012 в 16:18.
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 13.12.2012, 15:39   #684 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Сообщение от eevviill Посмотреть сообщение
Рекомендую тебе модифицировать ордер сразу после открытия. Таким образом не надо будет проверять стопы на каждом тике.

PHP код:
int ticket_op=-1;
 
 while(
IsTradeContextBusy()) Sleep(1000);
 
ticket_op=OrderSend(Symbol(),OP_BUYLIMIT,NormalizeDouble(Lot_*K_Lot+PlusLot,Lot_digits),NormalizeDouble(price_b-Step*point,Digits),slippage,0,0,comment,mag,0,Green);
 
Sleep(500);
 if(
ticket_op>-1) {OrderSelect(ticket_op,SELECT_BY_TICKET); OrderModify(ticket_op,OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(price_b-Step*point+prof*point,Digits),CLR_NONE);}                    
 } 
Ну так работает... НО... тогда почему не работал прошлый вариант, есть какие-н. мысли? Ведь написано то всё было верно на первый взгляд. Хочется понять и уяснить раз и на всегда., чтоб в будущем такого головняка больше не возникало...
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 13.12.2012, 15:45   #685 (permalink)
Заблокирован
За второе место в конкурсе 

 
Аватар для eevviill
 
Регистрация: 30.07.2009
Сообщений: 5,474
Репутация: 9022
eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill
Сказал(а) спасибо: 13,680
Поблагодарили 9,022 раз(а) в 3,179 сообщениях
Поинты: 1105
Отправить сообщение для eevviill с помощью Skype™
Сообщение от hoz Посмотреть сообщение
Ну так работает... НО... тогда почему не работал прошлый вариант, есть какие-н. мысли? Ведь написано то всё было верно на первый взгляд. Хочется понять и уяснить раз и на всегда., чтоб в будущем такого головняка больше не возникало...
Попробуй тут потсавить вместо g_ticket OrderTicket()
PHP код:
OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); 
eevviill вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 13.12.2012, 15:57   #686 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Пробывал, нет разницы. У меня g_ticket это глобальная переменная, которая равна OrderTicket()
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 13.12.2012, 16:47   #687 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,518
Репутация: 3643
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,110
Поблагодарили 3,647 раз(а) в 1,468 сообщениях
Поинты: 2004
Сообщение от hoz Посмотреть сообщение
Я переписал эксперт, и теперь у него не всегда при модификации ставятся стопы(для есн. типа счетов).

Вот что у меня в торговой ф-ции и ф-циях открытия и модификации):

Скрытый текст

PHP код:
//+-------------------------------------------------------------------------------------+
//| Модификация ордеров для ECN - счетов                                                |
//+-------------------------------------------------------------------------------------+
bool OrdersModifying()
{
  
int total OrdersTotal() - 1;
  
double sl 0tp 0;
  
  for(
int i=totali>=0i--)
  {
    if(
OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    
{
      if(
g_type == OP_BUY)
      {
        if(
i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           
sl NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        
if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           
tp NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      
}
      if(
g_type == OP_SELL)
      {
        if(
i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           
sl NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        
if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           
tp NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      
}
      if(
OrderStopLoss() != sl || OrderTakeProfit() != tp)                                                            // Если полученные значения sl и tp не равныы 0, то..
      
{
        
OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      
}
    }
  }
  return(
true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  
g_ticket = -1;
  
string myNote "сов баянул";
  
  if(
GetPriceToInput() < Ask)
  {       
    
g_ticket OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
  }
    if(
g_ticket && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(!
OrdersModifying())
        return(
false);
    }

  return(
true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  
g_ticket = -1;
  
string myNote "сов шортанул";

  if(
GetPriceToInput() > Bid)
  {
    
g_ticket OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
  }
    if(
g_ticket && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(!
OrdersModifying())
        return(
false);
    }
  
  return(
true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade (int signal)
{
  
FindOrders();

  if(
signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    
if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      
return(false);                                                                
      
  if(
signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     
if(!OpenSell())
       return(
false);                                                              // открываем лимитный ордер на продажу

 //   if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES))
  //  {
   //     if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
    //    OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
  //  }    
 // if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  
return(true);

[свернуть]



Может кто подсказать где ошибка? По логике всё верно как я вижу.
.
Твоя основная ошибка в
Код:
 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)


Вм
есто g_type правильно будет написать OrderType();
А условие выбора ордера лучше писать так


Код:
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
// здесь все операции с выбранным ордером.
}
.
И ещё, не путай глобальные переменные с переменными объявленными на глобальном уровне. Это абсолютно разные понятия.

Последний раз редактировалось AlexeyVik; 13.12.2012 в 16:50.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
eevviill (13.12.2012)
Старый 13.12.2012, 20:56   #688 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Интересно, зачем тогда на глобальном уровне объявлять тикет, если он нельзя применить в подобном случае?
Ведь он у меня объявлен глобально и ему присвоено значение OrderTicket()
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 13.12.2012, 21:06   #689 (permalink)
Заблокирован
За второе место в конкурсе 

 
Аватар для eevviill
 
Регистрация: 30.07.2009
Сообщений: 5,474
Репутация: 9022
eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill
Сказал(а) спасибо: 13,680
Поблагодарили 9,022 раз(а) в 3,179 сообщениях
Поинты: 1105
Отправить сообщение для eevviill с помощью Skype™
Сообщение от hoz Посмотреть сообщение
Интересно, зачем тогда на глобальном уровне объявлять тикет, если он нельзя применить в подобном случае?
Ведь он у меня объявлен глобально и ему присвоено значение OrderTicket()
Ну так правельно. И то что я тебе говорил и то что Алексей сказал нельзя писать. Так как на глобальном уровне и g_tick g_type присваивается значение не выбраного ордера(скорее всего первого открытого).
eevviill вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 13.12.2012, 22:30   #690 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Кто его знает, что там присваивает глобальная переменная тикета, но я точно уяснил, что если ордеров несколько, т.е. торговля ведётся ни одним ордеров, то глобальные тикеты не нужны, проще их объявлять внутри функций, дабы не путаться.
Кстати, всё-равно, даже после исправления стопы не ставятся. Вот что вышло после исправления:

Скрытый текст

PHP код:
//+-------------------------------------------------------------------------------------+
//| Модификация ордеров для ECN - счетов                                                |
//+-------------------------------------------------------------------------------------+
void OrdersModifying()
{
  
int total OrdersTotal() - 1;
  
double sl 0tp 0;
  
  for(
int i=totali>=0i--)
  {
    if(
OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    
{
      if(
OrderType() == OP_BUY)
      {
        if(
i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           
sl NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        
if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           
tp NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      
}
      if(
OrderType() == OP_SELL)
      {
        if(
i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           
sl NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        
if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           
tp NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      
}
      if(
sl != || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      
{
        
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      
}
    }
  }
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  
int g_ticket = -1;
  
string myNote "сов баянул";
  
  if(
GetPriceToInput() < Ask)
  {       
    
g_ticket OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
  }
    if(
g_ticket && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)

  return(
true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  
int g_ticket = -1;
  
string myNote "сов шортанул";

  if(
GetPriceToInput() > Bid)
  {
    
g_ticket OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
  }
    if(
g_ticket && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
  
  return(
true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade (int signal)
{
  
int total OrdersTotal() - 1;
  
  
FindOrders();

  if(
signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    
if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      
return(false);                                                                
      
  if(
signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     
if(!OpenSell())
       return(
false);                                                              // открываем лимитный ордер на продажу

    
OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES);
    {
      if(
OrderStopLoss() == || OrderTakeProfit() == 0)
        
OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    
}    
 
// if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  
return(true);

[свернуть]



Как посоветовал ты, eevviill работает всё исправно. А вот в том виде, что выше не работает.

Т.е. вот так всё работает идеально:

Скрытый текст

PHP код:
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  
g_ticket = -1;
  
string myNote "сов баянул";
  
  if(
GetPriceToInput() < Ask)
  {       
    
g_ticket OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
  }
    if(
g_ticket && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      
OrderModify(g_ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits),NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits),OrderOpenTime() + 86400,Lime);
    }

  return(
true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  
g_ticket = -1;
  
string myNote "сов шортанул";

  if(
GetPriceToInput() > Bid)
  {
    
g_ticket OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
  }
    if(
g_ticket && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      
OrderModify(g_ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits),NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits),OrderOpenTime() + 86400,Lime);
    }
  
  return(
true);

[свернуть]



А то что первоначально я написал код, не пашет категорически.

Последний раз редактировалось NSerega; 14.12.2012 в 01:09.
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 14.12.2012, 05:18   #691 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,518
Репутация: 3643
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,110
Поблагодарили 3,647 раз(а) в 1,468 сообщениях
Поинты: 2004
Сообщение от hoz Посмотреть сообщение
Интересно, зачем тогда на глобальном уровне объявлять тикет, если он нельзя применить в подобном случае?
Ведь он у меня объявлен глобально и ему присвоено значение OrderTicket()
Ну очень удивительно как ты можешь хоть что-то написать с такой способностью путать тикет ордера то с магиком то с типом ордера.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 14.12.2012, 05:34   #692 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,518
Репутация: 3643
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,110
Поблагодарили 3,647 раз(а) в 1,468 сообщениях
Поинты: 2004
Сообщение от eevviill Посмотреть сообщение
Ну так правельно. И то что я тебе говорил и то что Алексей сказал нельзя писать. Так как на глобальном уровне и g_tick g_type присваивается значение не выбраного ордера(скорее всего первого открытого).
Василий, а ты почему не видишь таких ляпов и помогаешь запутаться?
До сообщения hoz с этим кодом разговор шёл только о тикете ордера, а ты приплёл сюда ещё и тип. Ну объявлена переменная на глобальном уровне и что??? Ведь ей надо присвоить значение. Писать то надо Ticket = OrderSend(); только тогда можно будет с этим тикетом работать. И зачем все переменные объявлять на глобальном уровне??? Зачем тип ордера вообще в переменную записывать?

Я говорил только о том, что если объявить тикет на глобальном уровне то выбрать ордер для определения его свойств, таких как тип, СЛ, ТП, цена и время открытия ордера, можно без цикла, по тикету. Но и этим надо пользоваться с пониманием или хотя-бы прочесть справку.
Цитата:
Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера. Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых позиций терминала. Отличить открытую позицию от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным и был выбран из истории терминала. Отличить закрытый ордер от удаленного отложенного также можно по типу ордера.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
eevviill (14.12.2012)
Старый 14.12.2012, 05:47   #693 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,518
Репутация: 3643
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,110
Поблагодарили 3,647 раз(а) в 1,468 сообщениях
Поинты: 2004
Сообщение от hoz Посмотреть сообщение
Кто его знает, что там присваивает глобальная переменная тикета, но я точно уяснил, что если ордеров несколько, т.е. торговля ведётся ни одним ордеров, то глобальные тикеты не нужны, проще их объявлять внутри функций, дабы не путаться.
Кстати, всё-равно, даже после исправления стопы не ставятся. Вот что вышло после исправления:

Скрытый текст

PHP код:
//+-------------------------------------------------------------------------------------+
//| Модификация ордеров для ECN - счетов                                                |
//+-------------------------------------------------------------------------------------+
void OrdersModifying()
{
  
int total OrdersTotal() - 1;
  
double sl 0tp 0;
  
  for(
int i=totali>=0i--)
  {
    if(
OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    
{
      if(
OrderType() == OP_BUY)
      {
        if(
i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           
sl NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        
if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           
tp NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      
}
      if(
OrderType() == OP_SELL)
      {
        if(
i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           
sl NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        
if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           
tp NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      
}
      if(
sl != || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      
{
        
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      
}
    }
  }
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  
int g_ticket = -1;
  
string myNote "сов баянул";
  
  if(
GetPriceToInput() < Ask)
  {       
    
g_ticket OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
  }
    if(
g_ticket && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)

  return(
true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  
int g_ticket = -1;
  
string myNote "сов шортанул";

  if(
GetPriceToInput() > Bid)
  {
    
g_ticket OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
  }
    if(
g_ticket && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
  
  return(
true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade (int signal)
{
  
int total OrdersTotal() - 1;
  
  
FindOrders();

  if(
signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    
if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      
return(false);                                                                
      
  if(
signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     
if(!OpenSell())
       return(
false);                                                              // открываем лимитный ордер на продажу

    
OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES);
    {
      if(
OrderStopLoss() == || OrderTakeProfit() == 0)
        
OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    
}    
 
// if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  
return(true);

[свернуть]



Как посоветовал ты, eevviill работает всё исправно. А вот в том виде, что выше не работает.

Т.е. вот так всё работает идеально:

Скрытый текст

PHP код:
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  
g_ticket = -1;
  
string myNote "сов баянул";
  
  if(
GetPriceToInput() < Ask)
  {       
    
g_ticket OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
  }
    if(
g_ticket && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      
OrderModify(g_ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits),NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits),OrderOpenTime() + 86400,Lime);
    }

  return(
true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  
g_ticket = -1;
  
string myNote "сов шортанул";

  if(
GetPriceToInput() > Bid)
  {
    
g_ticket OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
  }
    if(
g_ticket && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      
OrderModify(g_ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits),NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits),OrderOpenTime() + 86400,Lime);
    }
  
  return(
true);

[свернуть]



А то что первоначально я написал код, не пашет категорически.
А это уже вообще ни в какие рамки не лезет...
Как можно открывать OP_BUYLIMIT и OP_SELLLIMIT, а модифицировать OP_BUY и OP_SELL
Не удивительно что не работает...
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
2 пользователя(ей) сказали cпасибо:
eevviill (14.12.2012), hoz (14.12.2012)
Старый 14.12.2012, 07:05   #694 (permalink)
Заблокирован
За второе место в конкурсе 

 
Аватар для eevviill
 
Регистрация: 30.07.2009
Сообщений: 5,474
Репутация: 9022
eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill
Сказал(а) спасибо: 13,680
Поблагодарили 9,022 раз(а) в 3,179 сообщениях
Поинты: 1105
Отправить сообщение для eevviill с помощью Skype™
Сообщение от AlexeyVik Посмотреть сообщение
А это уже вообще ни в какие рамки не лезет...
Как можно открывать OP_BUYLIMIT и OP_SELLLIMIT, а модифицировать OP_BUY и OP_SELL
Не удивительно что не работает...
Ага точно. Я и не заметил.

P.S. Просто hoz пишет много лишнего и я хочу помочь, но плутаюсь.
eevviill вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 15.12.2012, 15:27   #695 (permalink)
Заблокирован
 
Аватар для Essam
 
Регистрация: 22.07.2011
Сообщений: 314
Репутация: 1286
Essam Essam Essam Essam Essam Essam Essam Essam Essam
Сказал(а) спасибо: 213
Поблагодарили 1,285 раз(а) в 207 сообщениях
Поинты: 0

По умолчанию :)


#property copyright "eevviill"
#property link "itisallillusion@gmail.com"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 OrangeRed

double ExtMapBuffer1[];
double ExtMapBuffer2[];
extern int MA_fast_period = 40;
extern int MA_slow_period = 60;

bool gi_76 = FALSE;
bool gi_80 = FALSE;
bool gi_84 = FALSE;
int gi_unused_104 = 0;
string gs_88 = "alert.wav";
double gd_unused_108 = 0.618;
int gi_116 = 3;
int gi_120 = 0;
int gi_124 = 0;
int gi_128 = 0;
double g_ibuf_132[];
double g_ibuf_136[];
double g_bars_140;

int init()
{

SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(0,DRAW_ARROW,1,10);
SetIndexArrow(0,71);

SetIndexBuffer(1,ExtMapBuffer2);
SetIndexStyle(1,DRAW_ARROW,1,10);
SetIndexArrow(1,72);

return;
}


int start()
{
int li_4 = IndicatorCounted();
if (li_4 < 0) li_4 = 0;
if (li_4 > 0) li_4--;
int li_0 = Bars - li_4;
for (int li_8 = 0; li_8 < li_0; li_8++){
double MA1 = iMA(Symbol(),0,MA_fast_period,0,MODE_LWMA,PRICE_CL OSE,li_8+1);
double MA11 = iMA(Symbol(),0,MA_fast_period,0,MODE_LWMA,PRICE_CL OSE,li_8);
double MA2 = iMA(Symbol(),0,MA_slow_period,0,MODE_LWMA,PRICE_CL OSE,li_8+1);
double MA22 = iMA(Symbol(),0,MA_slow_period,0,MODE_LWMA,PRICE_CL OSE,li_8);
//if(MA11<MA22 && MA1>MA2) ExtMapBuffer1[li_8] =High[li_8]; //up
//if(MA11>MA22 && MA1<MA2) ExtMapBuffer2[li_8] =Low[li_8] ; //down

if (MA11 > MA22 + gi_128 * Point && MA1 <= MA2) {
ExtMapBuffer1[li_8] = iLow(Symbol(), 0, li_8) - 3.0 * Point;
ExtMapBuffer2[li_8] = EMPTY_VALUE;
if (gi_76 == TRUE) PlaySound(gs_88);
if (gi_84 == TRUE && Bars > g_bars_140) {
Alert(Symbol(), "Buy signal", Period());
g_bars_140 = Bars;
}
if (gi_80 == TRUE) Comment("Buy signal at Ask=", Ask, ", Bid=", Bid, ", Date=", TimeToStr(TimeCurrent(), TIME_DATE), " ", TimeHour(TimeCurrent()), ":", TimeMinute(TimeCurrent()), " Symbol=", Symbol(), " Period=", Period());
} else {
if (MA1 >= MA2 && MA11 < MA22 - gi_124 * Point) {
ExtMapBuffer1[li_8] = EMPTY_VALUE;
ExtMapBuffer2[li_8] = iHigh(Symbol(), 0, li_8) + 3.0 * Point;
if (gi_76 == TRUE) PlaySound(gs_88);
if (gi_84 == TRUE && Bars > g_bars_140) {
Alert(Symbol(), "Sell signal", Period());
g_bars_140 = Bars;
}
if (gi_80 == TRUE) Comment("Sell signal at Ask=", Ask, ", Bid=", Bid, ", Date=", TimeToStr(TimeCurrent(), TIME_DATE), " ", TimeHour(TimeCurrent()), ":", TimeMinute(TimeCurrent()), " Symbol=", Symbol(), " Period=", Period());
} else {
ExtMapBuffer1[li_8] = EMPTY_VALUE;
ExtMapBuffer2[li_8] = EMPTY_VALUE;
}
}
}

return;
}
Essam вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 16.12.2012, 13:59   #696 (permalink)
Активный участник
 
Аватар для mogul
 
Регистрация: 20.04.2009
Сообщений: 12
Репутация: 0
mogul
Сказал(а) спасибо: 8
Поблагодарили 0 раз(а) в 0 сообщениях
Поинты: 20
Приветствую всех. Нужна помощь.
есть хай и лоу (произвольно выбираем на графике, например 1.3157 и 1.3084). как мне посчитать колличество баров от этих хая до лоу? вывести нужно в Comment ("..., это сам сделаю, а вот посчитать не получается .
mogul вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 16.12.2012, 14:14   #697 (permalink)
Элитный участник
 
Аватар для Ugar
 
Регистрация: 13.03.2009
Сообщений: 2,252
Репутация: 1963
Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar
Сказал(а) спасибо: 347
Поблагодарили 1,892 раз(а) в 1,069 сообщениях
Поинты: 1270
Отправить сообщение для Ugar с помощью ICQ
Сообщение от mogul Посмотреть сообщение
Приветствую всех. Нужна помощь.
есть хай и лоу (произвольно выбираем на графике, например 1.3157 и 1.3084). как мне посчитать колличество баров от этих хая до лоу? вывести нужно в Comment ("..., это сам сделаю, а вот посчитать не получается .
Между двумя ценами нет баров, есть пункты. Можно конечно перебрать в цикле бары и найти к хаю какого бара эта цена относится. Но цена может оказаться такой что не будет существовать бара с таким хаем, а может оказаться несколько баров с таким хаем.
Если имеется ввиду хай какого то конкретного бара, то и сам хай не нужен. Если оба бара известны то просто номер одного вычесть из номера второго.

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
Ugar на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 16.12.2012, 14:21   #698 (permalink)
Активный участник
 
Аватар для mogul
 
Регистрация: 20.04.2009
Сообщений: 12
Репутация: 0
mogul
Сказал(а) спасибо: 8
Поблагодарили 0 раз(а) в 0 сообщениях
Поинты: 20
я наверное не так задал вопрос. выбираю фибой диапазон, на фибе вижу хай и лоу, вот мне и надо колличество баров от хая до лоу, фибо к примеру, хай и лоу произвольные, временные то рамки мы же видим, ну там вертикальной чертой или еще как, т.е. имея хай и лоу имеем их временные координаты, как посчитать?
mogul вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 16.12.2012, 14:32   #699 (permalink)
Активный участник
 
Аватар для mogul
 
Регистрация: 20.04.2009
Сообщений: 12
Репутация: 0
mogul
Сказал(а) спасибо: 8
Поблагодарили 0 раз(а) в 0 сообщениях
Поинты: 20
вот например участок который надо посчитать, так наглядней, а то может я не так вопрос задаю:
хай - 1.31253 от 2012.12.05 10:00
лоу - 1.28769 от 2012.12.07 15:30

на этом участке примерно 125 баров, мог сбиться немного, вручную считал, как вот програмно?

т.е. я ввел нужные мне цены с известной датой и индикатор мне бы дал ответ = 125 штук.

Последний раз редактировалось mogul; 16.12.2012 в 14:36.
mogul вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 16.12.2012, 15:37   #700 (permalink)
Элитный участник
 
Аватар для Ugar
 
Регистрация: 13.03.2009
Сообщений: 2,252
Репутация: 1963
Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar
Сказал(а) спасибо: 347
Поблагодарили 1,892 раз(а) в 1,069 сообщениях
Поинты: 1270
Отправить сообщение для Ugar с помощью ICQ
Сообщение от mogul Посмотреть сообщение
вот например участок который надо посчитать, так наглядней, а то может я не так вопрос задаю:
хай - 1.31253 от 2012.12.05 10:00
лоу - 1.28769 от 2012.12.07 15:30

на этом участке примерно 125 баров, мог сбиться немного, вручную считал, как вот програмно?

т.е. я ввел нужные мне цены с известной датой и индикатор мне бы дал ответ = 125 штук.
Зачем вводить цены если дата и время известны? Достаточно ввести дату и время двух баров. Примерно так:
Код:
   string TimeStp1="2012.12.05 10:00";
   string TimeStp2="2012.12.07 15:30";
   //Преобразование строки в время
   datetime Time1=StrToTime(TimeStp1);
   datetime Time2=StrToTime(TimeStp2);
   //Поиск бара по времени
   int Bar1=iBarShift(NULL,0,Time1,false);
   int Bar2=iBarShift(NULL,0,Time2,false);
   //Разница между номерами баров
   int Result=Bar1-Bar2;
Постарался написать максимально просто. Дата и время вводится в виде строки в строчные переменные TimeStp1 и TimeStp2.
Если время уже в формате datetime то преобразовывать строку в время не нужно. Время сразу записать в переменные Time1 и Time2.

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
Ugar на форуме   Ответить с цитированиемОтветить с цитированием  
2 пользователя(ей) сказали cпасибо:
eevviill (16.12.2012), Алекc1234 (16.12.2012)
Ответ

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 22:17. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
SEO by vBSEO