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

 
FAQ:
почему бы вам не запоминать тикет ордера а не его позицию. а что будет при прямой передаче если такого ордера нет? будете удалять нулевой ордер ?


Так пробывал уже. Вот так тоже на работает:

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket = 1,                                  // Тикет искомого ордера
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу

   double OOP = 20.0;                                  // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);

   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
      }
   }
   if (s_ticket != -1)
   {
      OrderDelete(s_ticket,Black);
   }
   return (0);
}
 
hoz:


Так пробывал уже. Вот так тоже на работает:

 

Внимательней надо
//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket = 1,                                  // Тикет искомого ордера
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу

   double OOP = 20.0;                                  // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);

   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
      }
   }
   if (s_ticket != -1)
   {
      OrderDelete(s_ticket,Black);
   }
   return (0);
}
 

 Наконец то заработало! Работал, в принципе, и прошлый вариант. Главный косяк был в вызове функции, а не в самой функции непосредственно.

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

 
hoz:

 Наконец то заработало! Работал, в принципе, и прошлый вариант. Главный косяк был в вызове функции, а не в самой функции непосредственно.

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

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

Я обычно использую либо 0, либо -1, в зависимости от назначения переменной. Если переменная в функции будет хранить найденный индекс позиции, то инициализировать её нужно в -1. Если инициализируете нулём, то после поиска нужной позиции и её отсутствия, вы всё-равно сможете выбрать позицию с индексом 0, хоть она и не будет искомой, при -1 позиция выбрана не будет. Это один из всевозможных примеров, когда ошибку сложно найти - вроде бы всё верно в функции, а на выходе совсем не то... и советник работает не с тем ордером/позицией, которые ожидались...

 

        Функция должна быть короткой (необязательно, но желательно) и совершенно ясной (ее назначение). как 2*2=4. то есть программист должен четко представлять для чего она предназначена и какую операцию выполняет. потом он должен выкинуть ее из головы и забыть что у нее внутри, и использовать как "черный ящик".

       Все переменные которые использует функция должны быть переданы ей как аргументы. Использование глобальных переменных без передачи в списке аргументов оправдано только лишь в том случае если это например Экстерны (в случае МТ). Изменение глобалок в функции не приемлимо , если не хватает одного возвращаемого значения передайте переменные по ссылке в списке аргументов.

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

 

Всем привет!

Тестирую Фунт-Ена

Ордер должен закрыться по ТЕЙК-ПРОФИТУ раньше чем по СТОП-ЛОССУ

Но по ТЕЙК-ПРОФИТУ ордер почему то не закрылся.

ВОПРОС:ПОЧЕМУ ОРДЕР НЕ ЗАКРЫЛСЯ ПО ТЕЙК ПРОФИТУ КАК ПРОПИСАНО В ТОРГОВОЙ ФУНКЦИИ

Метод моделирования - все тики.

Пример в ссылке

http://clip2net.com/s/55pdDU

ПРИМЕЧЕНИЕ.Такие случаи - происходят не часто.В большинстве случаев сделки закрываются по стопу 10 пп. своевременно.

Т.е. как мне кажется,это наверное не связано с минимально допустимой дистанцией между ценой и стопом.

В чем еще может быть причина?

Спасибо.

 

Помогите взять данные в глобальные переменные с индикатора

примерно:

USD 6.5

EUR 6.6

GBP 3.3

и т.д.

Заранее признателен за помощь !

/*Декомпил удален. Предупреждение*/

 
FAQ:

        Функция должна быть короткой (необязательно, но желательно) и совершенно ясной (ее назначение). как 2*2=4. то есть программист должен четко представлять для чего она предназначена и какую операцию выполняет. потом он должен выкинуть ее из головы и забыть что у нее внутри, и использовать как "черный ящик".

       Все переменные которые использует функция должны быть переданы ей как аргументы. Использование глобальных переменных без передачи в списке аргументов оправдано только лишь в том случае если это например Экстерны (в случае МТ). Изменение глобалок в функции не приемлимо , если не хватает одного возвращаемого значения передайте переменные по ссылке в списке аргументов.

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


Благодарю Вас, и, Артёма, конечно! Вы мне приоткрыли глаза на те моменты, которые, в принципе и логичны, но иногда от не достатка опыта оставались не замеченными.

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

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

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

Вот сегодня прочитав Ваше сообщение задумался, и переместил некоторые переменные с глобальных в функцию. Потом я понял, что эти переменные нужны ещё в другой функции, которая не связана с той, где я их объявил. Если послушать Вас вот тут: " Изменение глобалок а функции не приемлимо ", то получается нужно тут функцию, которая непосредственно получает необходимые переменные вызывать в разных местах? Но это уже делает код так сказать не красивым. Ведь хочется чтоб функция вызывалась когда нужно, и не чаще чем нужно. Например, функция поиска оредров всех, отложек бай и отложек селл. Разумно преположить, что её вызывать будем уместно только раз за тик и не большее. Но, если её вызвать в старте, то через параметры не каждой функции, использующей данные переменные, возвращаемые функцией поиска ордеров можно будет передать через параметры эти переменные. Тогда получается всё же возвращаемся к глобальные переменным или как?

 

Помогите пожалуйста решить проблему с ограничением значения shift в iHigh(Symbol(),timeframe,shift), которое ограничивается числом 1000.

iTime(Symbol(),timeframe,1001) дает 1970.01.01 00:00
 
Как блин выключить алерт ???????? почему после нажатия пробела, он ?(!%"?:? продолжает пищать ??????????
Причина обращения: