Ответить
14.01.2013, 05:59
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,624
Поблагодарили 3,758 раз(а) / Репутация: 3750
Я не это имел ввиду. Разница в том, что так открытые ордера не перебирают:

PHP код:
 for (int i OrdersTotal(); >= 0--) 
Перебирают так:

PHP код:
 for (int i OrdersTotal() - 1>= 0--) 
А закрытые почему-то так не перебирают:

PHP код:
for (int i 0OrdersHistoryTotal() - 1++) 
А перебирают так:

PHP код:
for (int i 0OrdersHistoryTotal(); ++) 
Ты не там ищешь разницу...
OrdersTotal() возвращает к-во открытых и отложенных ордеров. Но нумерация начинается с нуля. Потому и получается, что 2 открытых ордера имеют индекс 0 и 1 т.е. OrdersTotal()-1
OrdersHistoryTotal() работает так-же, только возвращает к-во ордеров из вкладки "История Счёта" согласно настройкам этой вкладки. Если настроить чтобы показывались ордера только за сегодня то будет количество закрытых сегодня.
И раз уж начали об этом... Если ордер закрыт в 23:59 и не попадает в список истории счёта, то он остаётся недоступным. А юзер существо непредсказуемое, может сделать так, что и в голову тебе прийти не может (из личного опыта), поэтому при поиске ордера из истории надо такой вариант надо учитывать.
Так, вот OrdersTotal()-1 и OrdersHistoryTotal()-1 будет пограмотней, но и лишняя итерация цикла занимает времени < 1 миллисекунды. Многие это считают не критичным и не минусуют 1 из к-ва ордеров.
14.01.2013, 08:05
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

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

PHP код:
 for (int i OrdersTotal(); >= 0--) 

Перебирают так:

PHP код:
 for (int i OrdersTotal() - 1>= 0--) 

А закрытые почему-то так не перебирают:

PHP код:
for (int i 0OrdersHistoryTotal() - 1++) 

А перебирают так:

PHP код:
for (int i 0OrdersHistoryTotal(); ++) 
Я понял про что ты спрашиваешь.
Всё дело в знаке =
Посмотри. Между эими вариантами нету разницы.
PHP код:
for (int i 0OrdersHistoryTotal(); ++) 
PHP код:
for (int i 0<= OrdersHistoryTotal()-1++) 
AlexeyVik , hoz 
14.01.2013, 09:40
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Я понял про что ты спрашиваешь.
Всё дело в знаке =
Посмотри. Между эими вариантами нету разницы.
PHP код:
for (int i 0OrdersHistoryTotal(); ++) 
PHP код:
for (int i 0<= OrdersHistoryTotal()-1++) 

Точно. Вот я на ровном месте споткнулся На таком просто моменте
14.01.2013, 10:57
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
И раз уж начали об этом... Если ордер закрыт в 23:59 и не попадает в список истории счёта, то он остаётся недоступным.

Как он не попадёт в список истории, если он уже закрыт? Цикл то не по времени, а по ордерам..
14.01.2013, 11:44
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,624
Поблагодарили 3,758 раз(а) / Репутация: 3750
Как он не попадёт в список истории, если он уже закрыт? Цикл то не по времени, а по ордерам..
Я не думал, что надо расписывать досконально...
Открой вкладку "История счёта", клик пкм (правой кнопкой мыши), в контекстном меню лкм "Выбрать период", в появившемся окне выбрать "Сегодня", лкм "ок" Посчитай сколько осталось ордеров...
Потом в какой либо код добавь Comment(OrdersHistoryTotal());
Если после этого, в таком состоянии вкладки "История Счёта" сможешь программно найти ордер который был закрыт вчера...
14.01.2013, 11:59
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,624
Поблагодарили 3,758 раз(а) / Репутация: 3750
Я не это имел ввиду. Разница в том, что так открытые ордера не перебирают:

PHP код:
 for (int i OrdersTotal(); >= 0--) 
Перебирают так:

PHP код:
 for (int i OrdersTotal() - 1>= 0--) 
А закрытые почему-то так не перебирают:

PHP код:
for (int i 0OrdersHistoryTotal() - 1++) 
А перебирают так:

PHP код:
for (int i 0OrdersHistoryTotal(); ++) 
Я понял про что ты спрашиваешь.
Всё дело в знаке =
Посмотри. Между эими вариантами нету разницы.
PHP код:
for (int i 0OrdersHistoryTotal(); ++) 
PHP код:
for (int i 0<= OrdersHistoryTotal()-1++) 
Василий, а где ты нашёл <= в коде hoz'a?... Я вижу только >= 0
14.01.2013, 12:03
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,033 раз(а) / Репутация: 9033
  • Отправить сообщение для eevviill с помощью Skype™
Василий, а где ты нашёл <= в коде hoz'a?... Я вижу только >= 0
Не нашел, но догадался что так должно было быть.
14.01.2013, 12:32
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Я не думал, что надо расписывать досконально...
Открой вкладку "История счёта", клик пкм (правой кнопкой мыши), в контекстном меню лкм "Выбрать период", в появившемся окне выбрать "Сегодня", лкм "ок" Посчитай сколько осталось ордеров...
Потом в какой либо код добавь Comment(OrdersHistoryTotal());
Если после этого, в таком состоянии вкладки "История Счёта" сможешь программно найти ордер который был закрыт вчера...

Смысл в том, что я же не спрашивал как посмотреть историю за какой-то срок.. Странно, что советник ищет только в том периоде, как я понял, какой выбран пользователем в пользовательском интерфейсе. По сути, одно не должно мешать другому. Абсурдно как-то..
14.01.2013, 12:36
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Не нашел, но догадался что так должно было быть.

По ходу нужно и закрытые ордера перебирать от последнего закрытого к первому, а не иначе.. Т.к. те которые закрыты раньше, имеют же не тот " вес ", а нам важнее последние, в принципе. Буду корректировать этот момент.
14.01.2013, 12:48
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,624
Поблагодарили 3,758 раз(а) / Репутация: 3750
Абсурдно как-то..
Я-бы не сказал, что это абсурдно... Прикинь сколько ордеров может набраться за 3-4 года... И сколько времени понадобится для перебора всего списка. А если есть желание то поэкспериментируй с направлением сортировки списка. Какой ордер будет иметь какой индекс.
Я это не экспериментировал, мне хватило того, что OrderSelect(0, SELECT_BY_POS, MODE_HISTORY) выбирал не тот ордер который мне был нужен. Я сразу от такого подхода отказался.
eevviill , hoz 
14.01.2013, 13:57
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Я-бы не сказал, что это абсурдно... Прикинь сколько ордеров может набраться за 3-4 года... И сколько времени понадобится для перебора всего списка. А если есть желание то поэкспериментируй с направлением сортировки списка. Какой ордер будет иметь какой индекс.
Я это не экспериментировал, мне хватило того, что OrderSelect(0, SELECT_BY_POS, MODE_HISTORY) выбирал не тот ордер который мне был нужен. Я сразу от такого подхода отказался.

Тоже верно. Хотя 0 (нуль) как индекс это уж слишком.


Я написал код, чтоб закрывать частично, на разных уровнях ценовых позицию дробя лот. Что-то странно работает. Некоторые ордера как-будто пропускает и они висят мёртвым грузом. Что тут не так? Вроде как всё чётко.

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

PHP код:
//+-------------------------------------------------------------------------------------+
//|TakeProfitLots                                                                       |
//+-------------------------------------------------------------------------------------+
double TakeProfitLots(double lotPrimaryint approach)
{
  
double lotDealToClose;                                       // лот для закрытия на данном уровне тейк-профита
  
if (approach == 1)
      
lotDealToClose lotPrimary i_tp1Percent 100;
        return (
LotRound(lotDealToClose));
  if (
approach == 2)
      
lotDealToClose lotPrimary i_tp2Percent 100;
        return (
LotRound(lotDealToClose));
  if (
approach == 3)
      
lotDealToClose lotPrimary i_tp3Percent 100;
        return (
LotRound(lotDealToClose));
}
//+-------------------------------------------------------------------------------------+
//| Проверка объема на корректность и округление                                        |
//+-------------------------------------------------------------------------------------+
double LotRound(double L)
{
  return(
MathRound(MathMin(MathMax(LminLot), maxLot)/lotStep)*lotStep);
}
//+-------------------------------------------------------------------------------------+
//| Определяем количество закрытий ордеров                                              |
//+-------------------------------------------------------------------------------------+
int OrderCloseCount(double ordOpPricedatetime ordOpTime)
{
  
int count 0;
  
  for (
int i OrdersHistoryTotal() - 1>= i--)
  {
    if (!
OrderSelect(iSELECT_BY_POSMODE_HISTORY)) continue;
      if (
OrderSymbol() != Symbol()) continue;
          if (
OrderOpenPrice() == ordOpPrice && OrderOpenTime() == ordOpTime)
              
count++;
  }
  
   return (
count);
}
//+-------------------------------------------------------------------------------------+
//| Определяем тейк-профиты                                                             |
//+-------------------------------------------------------------------------------------+
void TakeProfits()
{
  
int type;
  
double OOP;
  
datetime OOT;
  
int ticket;
  
int counterOfCloses;
  
  for (
int i OrdersTotal() - 1>= 0i--)
  {  
    if (!
OrderSelect(iSELECT_BY_POSMODE_TRADES)) continue;
      if (
OrderSymbol() != Symbol()) continue;
          
type OrderType();
          
OOP OrderOpenPrice();
          
OOT OrderOpenTime();
          
i_lot OrderLots();
          
ticket OrderTicket();
          
counterOfCloses OrderCloseCount(OOPOOT);
          
          
RefreshRates();
          
          if (
type == OP_SELL)
          {
           if (
i_takeProfit1 0)
               if (
Ask <= OOP i_takeProfit1 pt && counterOfCloses == 0)
                   
OrderClose(ticketTakeProfitLots(i_lot1), Aski_slippageBlack);
           if (
i_takeProfit2 0)
               if (
Ask <= OOP i_takeProfit2 pt && counterOfCloses == 1)
                   
OrderClose(ticketTakeProfitLots(i_lot2), Aski_slippageBlack);
           if (
i_takeProfit3 0)
               if (
Ask <= OOP i_takeProfit3 pt && counterOfCloses == 2)
                  
OrderClose(ticketTakeProfitLots(i_lot3), Aski_slippageBlack);
          }
          
          if (
type == OP_BUY)
          {
           if (
i_takeProfit1 0)
               if (
Bid >= OOP i_takeProfit1 pt && counterOfCloses == 0)
                   
OrderClose(ticketTakeProfitLots(i_lot1), Bidi_slippageBlack);
           if (
i_takeProfit2 0)
               if (
Bid >= OOP i_takeProfit2 pt && counterOfCloses == 1)
                   
OrderClose(ticketTakeProfitLots(i_lot2), Bidi_slippageBlack);
           if (
i_takeProfit3 0)
               if (
Bid >= OOP i_takeProfit3 pt && counterOfCloses == 2)
                   
OrderClose(ticketTakeProfitLots(i_lot3), Bidi_slippageBlack);
          }
  }

Касательно переменных объявленных на глобальном уровне, которых тут не видно вот что нужно:

PHP код:
extern int i_takeProfit1 10;                           // Величина 1-ого тейк-профита
extern int i_takeProfit2 20;                           // Величина 2-го тейк-профита
extern int i_takeProfit3 25;                            // Величина 3-го тейк-профита
extern int i_tp1Percent 50;                            // Процент от основного лота для закрытия 1-го тейк- профита
extern int i_tp2Percent 30;                            // Процент от основного лота для закрытия 2-го тейк-профита
extern int i_tp3Percent 20;                             // Процент от основного лота для закрытия 3-го тейк-профита
extern int i_slippage 2;
extern double i_lot 0.1;
#define SIGNAL_BUY                        0                          // Сигнал на покупку
#define SIGNAL_SELL                       1                          // Сигнал на продажу
#define SIGNAL_NO                        -1                          // Сигнала нет 
Это в init:

PHP код:
minLot MarketInfo(Symbol(), MODE_MINLOT);
    
maxLot MarketInfo(Symbol(), MODE_MAXLOT);
    
lotStep MarketInfo(Symbol(), MODE_LOTSTEP); 
[свернуть]

Последний раз редактировалось chocolate; 19.01.2013 в 13:23.
14.01.2013, 14:43
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,624
Поблагодарили 3,758 раз(а) / Репутация: 3750
Тоже верно. Хотя 0 (нуль) как индекс это уж слишком.
Почему?
14.01.2013, 15:01
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Почему?
Ну ты первый закрытый хотел узнать? Смысла не вижу.
14.01.2013, 15:46
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,624
Поблагодарили 3,758 раз(а) / Репутация: 3750
Ну ты первый закрытый хотел узнать? Смысла не вижу.
Я же тебе предложил поэкспериментировать. Возьми хоть 0 хоть OrdersHistoryTotal()-1 всё равно не всегда получишь нужный результат.
Только не спеши с выводами. Даже если получишь 9 правильных из 10ти это уже не приемлемо. В какой момент будет ошибка я знаю. Теперь узнай ты.
14.01.2013, 15:51
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Ну попутно поэкспериментирую. Сейчас ломаю голову над тем кодом, что выше привёл. Абы что происходит вообще.
14.01.2013, 22:10
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
В общем-то, вопрос с дроблением лота снимаю. Я, всё-таки осилил это дело.

Появился вопрос.

Вот функция для открытия шортовых ордеров. На вид не обращайте внимания, ф-ция написано для отладки..

PHP код:
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  
int ticket = -1;
  
string myNote "Сов шортанул";
  
//int SL = OrderOpenPrice() + i_sl * pt;
  
  
while (IsTradeAllowed() == falseSleep(1000);
  
RefreshRates();
  
ticket OrderSend(Symbol(),OP_SELL,i_lot,Bid,3,0,0,myNote,i_myMagic,0,Red);
  if (
ticket && OrderSelect(ticket,SELECT_BY_TICKET) == true)
  {
    
IsBuyNow 0;
    if (
i_sl && OrderStopLoss() == 0)
    {
      if (!
OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice() + i_sl pt,Digits),0,0))
       {
        Print (
"Ошибка установки первичного стопа для шортов "OrderType(), " - "GetLastError());
        Print(
"Ask = "Ask);
        Print(
"Bid = "Bid);
        Print(
"OrderOpenPrice() + i_sl * pt = "OrderOpenPrice() + i_sl pt);
       }
    }
  }
  return(
true);


Хочется сделать код красивее. В функцию модификации ордера вместо:

PHP код:
NormalizeDouble(OrderOpenPrice() + i_sl pt,Digits
Чтоб было тока переменная типа:

PHP код:
NormalizeDouble(SL,Digits
Ну а SL где-то выше присвоить значение OrderOpenPrice() + i_sl * pt

Если это сделать вверху, то там значения цены открытия ордера ещё нет, и на выходе будет ерунда. Как тогда поступить?
15.01.2013, 03:39
Аватар для alexshell
alexshell alexshell на форуме Элитный участник
Регистрация: 29.10.2010 / Сообщений: 692
Поблагодарили 1,695 раз(а) / Репутация: 1697
В общем-то, вопрос с дроблением лота снимаю. Я, всё-таки осилил это дело.

Появился вопрос.

Вот функция для открытия шортовых ордеров. На вид не обращайте внимания, ф-ция написано для отладки..




Хочется сделать код красивее. В функцию модификации ордера вместо:

PHP код:
NormalizeDouble(OrderOpenPrice() + i_sl pt,Digits
Чтоб было тока переменная типа:

PHP код:
NormalizeDouble(SL,Digits
Ну а SL где-то выше присвоить значение OrderOpenPrice() + i_sl * pt

Если это сделать вверху, то там значения цены открытия ордера ещё нет, и на выходе будет ерунда. Как тогда поступить?
Вот так:
PHP код:
  if (i_sl && OrderStopLoss() == 0)
    {
double SL=OrderOpenPrice() + i_sl pt;
      if (!
OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),0,0))
       {
        Print (
"Ошибка установки первичного стопа для шортов "OrderType(), " - "GetLastError());
        Print(
"Ask = "Ask);
        Print(
"Bid = "Bid);
        Print(
"OrderOpenPrice() + i_sl * pt = "OrderOpenPrice() + i_sl pt);
       }
    } 
hoz 
15.01.2013, 05:24
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,624
Поблагодарили 3,758 раз(а) / Репутация: 3750
Или вынеси NormalizeDouble во внешнюю функцию
double ND(double X) {return(NormalizeDouble(X, Digits));}
Тогда это будет выглядеть так
ND(OrderOpenPrice() + i_sl * pt)

А если объединишь 2 совета вместе то получится ND(SL)
eevviill , hoz 
16.01.2013, 15:09
Аватар для Allis Amazing
Allis Amazing Allis Amazing вне форума Интересующийся
Регистрация: 22.07.2012 / Сообщений: 19
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Приветствую всех! Подскажите, ежели кто знает, как может называться функция модификации открытых ордеров, и главное как её отобрать у Совы, что бы не нарушить весь дальнейший ход событий?)
16.01.2013, 16:31
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,624
Поблагодарили 3,758 раз(а) / Репутация: 3750
Сообщение от: Allis Amazing
Приветствую всех! Подскажите, ежели кто знает, как может называться функция модификации открытых ордеров, и главное как её отобрать у Совы, что бы не нарушить весь дальнейший ход событий?)
Ты может быть не представляешь сколько вариантов понимания слова "отобрать"?
Если по нашему... "лишить чего-либо, то-есть, отнять у вас и приумножить у нас"... то просто надо найти все строки содержащие OrderModify и их удалить или закомментировать...
Ответить

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


Опции темы

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

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



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


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