Ответить
13.12.2012, 14:49
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,033 раз(а) / Репутация: 9033
  • Отправить сообщение для eevviill с помощью Skype™
Я переписал эксперт, и теперь у него не всегда при модификации ставятся стопы(для есн. типа счетов).

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

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,033 раз(а) / Репутация: 9033
  • Отправить сообщение для 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.
13.12.2012, 15:11
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
А 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.
13.12.2012, 15:39
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Рекомендую тебе модифицировать ордер сразу после открытия. Таким образом не надо будет проверять стопы на каждом тике.

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);}                    
 } 
Ну так работает... НО... тогда почему не работал прошлый вариант, есть какие-н. мысли? Ведь написано то всё было верно на первый взгляд. Хочется понять и уяснить раз и на всегда., чтоб в будущем такого головняка больше не возникало...
13.12.2012, 15:45
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,033 раз(а) / Репутация: 9033
  • Отправить сообщение для eevviill с помощью Skype™
Ну так работает... НО... тогда почему не работал прошлый вариант, есть какие-н. мысли? Ведь написано то всё было верно на первый взгляд. Хочется понять и уяснить раз и на всегда., чтоб в будущем такого головняка больше не возникало...
Попробуй тут потсавить вместо g_ticket OrderTicket()
PHP код:
OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); 
13.12.2012, 15:57
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Пробывал, нет разницы. У меня g_ticket это глобальная переменная, которая равна OrderTicket()
13.12.2012, 16:47
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,624
Поблагодарили 3,758 раз(а) / Репутация: 3750
Я переписал эксперт, и теперь у него не всегда при модификации ставятся стопы(для есн. типа счетов).

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

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

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.
13.12.2012, 20:56
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Интересно, зачем тогда на глобальном уровне объявлять тикет, если он нельзя применить в подобном случае?
Ведь он у меня объявлен глобально и ему присвоено значение OrderTicket()
13.12.2012, 21:06
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,033 раз(а) / Репутация: 9033
  • Отправить сообщение для eevviill с помощью Skype™
Интересно, зачем тогда на глобальном уровне объявлять тикет, если он нельзя применить в подобном случае?
Ведь он у меня объявлен глобально и ему присвоено значение OrderTicket()
Ну так правельно. И то что я тебе говорил и то что Алексей сказал нельзя писать. Так как на глобальном уровне и g_tick g_type присваивается значение не выбраного ордера(скорее всего первого открытого).
13.12.2012, 22:30
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для 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.
14.12.2012, 05:18
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,624
Поблагодарили 3,758 раз(а) / Репутация: 3750
Интересно, зачем тогда на глобальном уровне объявлять тикет, если он нельзя применить в подобном случае?
Ведь он у меня объявлен глобально и ему присвоено значение OrderTicket()
Ну очень удивительно как ты можешь хоть что-то написать с такой способностью путать тикет ордера то с магиком то с типом ордера.
14.12.2012, 05:34
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,624
Поблагодарили 3,758 раз(а) / Репутация: 3750
Ну так правельно. И то что я тебе говорил и то что Алексей сказал нельзя писать. Так как на глобальном уровне и g_tick g_type присваивается значение не выбраного ордера(скорее всего первого открытого).
Василий, а ты почему не видишь таких ляпов и помогаешь запутаться?
До сообщения hoz с этим кодом разговор шёл только о тикете ордера, а ты приплёл сюда ещё и тип. Ну объявлена переменная на глобальном уровне и что??? Ведь ей надо присвоить значение. Писать то надо Ticket = OrderSend(); только тогда можно будет с этим тикетом работать. И зачем все переменные объявлять на глобальном уровне??? Зачем тип ордера вообще в переменную записывать?

Я говорил только о том, что если объявить тикет на глобальном уровне то выбрать ордер для определения его свойств, таких как тип, СЛ, ТП, цена и время открытия ордера, можно без цикла, по тикету. Но и этим надо пользоваться с пониманием или хотя-бы прочесть справку.
Цитата:
Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера. Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых позиций терминала. Отличить открытую позицию от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным и был выбран из истории терминала. Отличить закрытый ордер от удаленного отложенного также можно по типу ордера.
14.12.2012, 05:47
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,624
Поблагодарили 3,758 раз(а) / Репутация: 3750
Кто его знает, что там присваивает глобальная переменная тикета, но я точно уяснил, что если ордеров несколько, т.е. торговля ведётся ни одним ордеров, то глобальные тикеты не нужны, проще их объявлять внутри функций, дабы не путаться.
Кстати, всё-равно, даже после исправления стопы не ставятся. Вот что вышло после исправления:

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

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
Не удивительно что не работает...
eevviill , hoz 
14.12.2012, 07:05
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

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

P.S. Просто hoz пишет много лишнего и я хочу помочь, но плутаюсь.
15.12.2012, 15:27
Аватар для Essam
Essam Essam вне форума Заблокирован
Регистрация: 22.07.2011 / Сообщений: 314
Поблагодарили 1,288 раз(а) / Репутация: 1289

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

#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;
}
16.12.2012, 13:59
Аватар для mogul
mogul mogul вне форума Активный участник
Регистрация: 20.04.2009 / Сообщений: 12
Поблагодарили 0 раз(а) / Репутация: 0
Приветствую всех. Нужна помощь.
есть хай и лоу (произвольно выбираем на графике, например 1.3157 и 1.3084). как мне посчитать колличество баров от этих хая до лоу? вывести нужно в Comment ("..., это сам сделаю, а вот посчитать не получается .
16.12.2012, 14:14
Регистрация: 13.03.2009 / Сообщений: 2,394
Поблагодарили 1,974 раз(а) / Репутация: 2051
Приветствую всех. Нужна помощь.
есть хай и лоу (произвольно выбираем на графике, например 1.3157 и 1.3084). как мне посчитать колличество баров от этих хая до лоу? вывести нужно в Comment ("..., это сам сделаю, а вот посчитать не получается .
Между двумя ценами нет баров, есть пункты. Можно конечно перебрать в цикле бары и найти к хаю какого бара эта цена относится. Но цена может оказаться такой что не будет существовать бара с таким хаем, а может оказаться несколько баров с таким хаем.
Если имеется ввиду хай какого то конкретного бара, то и сам хай не нужен. Если оба бара известны то просто номер одного вычесть из номера второго.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
16.12.2012, 14:21
Аватар для mogul
mogul mogul вне форума Активный участник
Регистрация: 20.04.2009 / Сообщений: 12
Поблагодарили 0 раз(а) / Репутация: 0
я наверное не так задал вопрос. выбираю фибой диапазон, на фибе вижу хай и лоу, вот мне и надо колличество баров от хая до лоу, фибо к примеру, хай и лоу произвольные, временные то рамки мы же видим, ну там вертикальной чертой или еще как, т.е. имея хай и лоу имеем их временные координаты, как посчитать?
16.12.2012, 14:32
Аватар для mogul
mogul mogul вне форума Активный участник
Регистрация: 20.04.2009 / Сообщений: 12
Поблагодарили 0 раз(а) / Репутация: 0
вот например участок который надо посчитать, так наглядней, а то может я не так вопрос задаю:
хай - 1.31253 от 2012.12.05 10:00
лоу - 1.28769 от 2012.12.07 15:30

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

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

Последний раз редактировалось mogul; 16.12.2012 в 14:36.
16.12.2012, 15:37
Регистрация: 13.03.2009 / Сообщений: 2,394
Поблагодарили 1,974 раз(а) / Репутация: 2051
вот например участок который надо посчитать, так наглядней, а то может я не так вопрос задаю:
хай - 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
Чужие программы не переделываю!
Ответить

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


Опции темы

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

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



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


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