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

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,031 раз(а) / Репутация: 9031
  • Отправить сообщение для eevviill с помощью Skype™
У меня следующая ситуация. Совок ставит в определённое время, а точнее, по закрытия свечи на D1 отложенный ордер - лимитник по канкретной цене. Если лимитник не сработал к закрытию следующей свечи на, то его нужно просто удалить.

Если вариантов несколько как я понимаю:

1. Можно дать параметру expiration функции OrderSend() значение, т.е. просчитать его и задать ровно 24 часа в секундах, итого получиться (60 * 60) *24 часа = 86400 секунд.
Т.е. ордер будет иметь такой вид(если байлимит):

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

PHP код:
OrderSend(string symbolOP_BUYLIMITdouble volumedouble priceint slippagedouble stoplossdouble takeprofitstring comment=NULLint magic=0datetime 86400color arrow_color=CLR_NONE
[свернуть]



2. Другой вариант, будет таким, что можно создать условие типа:

PHP код:
if( (time[0] == ВРЕМЯГДЕ ОРДЕР НУЖНО ЗАКРЫТЬ ) && ( Ordertype >= ))
  {
     
Orderclose();
  } 

Т.е. если время, в которое истекает срок его закрытия пришло и тип ордера - отложенник.. ЗАКРЫВАЕМ ЕГО.

Прошу подсказать как более грамотно реализовать данный момент.
А может есть ещё какие варианты?
Слушай. У меня третий вариант. Очень простой.
PHP код:
Sleep(24*60*60*1000); 
25.11.2012, 13:34
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Ну так всё правильно. Советник будет на открытии свечи проверять условия. Или тебе надо открыто в 15, проверка на следующий день в 15?
eevviill, у тебя указано, что:
PHP код:
iTime(Symbol(),0,0

Советник находится на ТФ H1. Если и пользоваться таймсерией, то нужно указывать ТФ = 1440 в нужном месте, иначе он будет возвращать значение времени открытия часа. А это нам не нужно. Нам важен день, в данном случае.

Всё. Понял. Но Time[0], я думаю нельзя использовать. Ровно через 24 часа именно такого времени может не быть. особенно если флэт.

Какая разница флет или тренд? Бар то всё-равно закроется, а Time[0], это всего лишь значение времени открытия текущего бара и только лишь.. В данном случает дневки.

Слушай. У меня третий вариант. Очень простой.
PHP код:
Sleep(24*60*60*1000); 

Ага. Тока это тоже самое, что и:

PHP код:
OrderSend(Symbol(),g_type,lot,GetPriceToInput(),NULL,SL Point,TP Point," ",magic,86400,Green

у меня

Тут смысл в том, что нет смысла впихивать в код лишние строчки, если в этом нет необходимости.

Последний раз редактировалось hoz; 25.11.2012 в 13:39.
25.11.2012, 14:54
Аватар для Алекc1234
Алекc1234 Алекc1234 вне форума Местный житель
Регистрация: 24.03.2011 / Сообщений: 697
Поблагодарили 276 раз(а) / Репутация: 276
eevviill, никак не могу сделать так, чтобы при открытии нескольких рыночных ордеров, в коде написать цену первого открытого ордера? То есть OderOpenPrice() первого по времени открытого ордера. Сделал, как Вы написали
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
double fir_or_pr=OrderOpenPrice();
но сов видит цену последнего по времени открытого ордера. Можно ли что-нибудь сделать? Может, по другому нужно?
25.11.2012, 15:16
Аватар для Алекc1234
Алекc1234 Алекc1234 вне форума Местный житель
Регистрация: 24.03.2011 / Сообщений: 697
Поблагодарили 276 раз(а) / Репутация: 276
Делаю так(подобно приведённому выше коду)
if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
{
double fir_or_pr = OrderOpenPrice();
if(ot==OP_BUY)
{
prof = NormalizeDouble((Bid-fir_or_pr),Digits)/Point; }
if (ot == OP_SELL)
{
prof = NormalizeDouble((fir_or_pr-Ask),Digits)/Point; }
}
Но всё равно сов не видит цену первого открытого ордера, а смотрит на последнюю цену.
25.11.2012, 15:17
Регистрация: 13.03.2009 / Сообщений: 2,360
Поблагодарили 1,966 раз(а) / Репутация: 2043
Сообщение от: Алекc1234
eevviill, никак не могу сделать так, чтобы при открытии нескольких рыночных ордеров, в коде написать цену первого открытого ордера? То есть OderOpenPrice() первого по времени открытого ордера. Сделал, как Вы написали
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
double fir_or_pr=OrderOpenPrice();
но сов видит цену последнего по времени открытого ордера. Можно ли что-нибудь сделать? Может, по другому нужно?
Конечно это последний. Для первого надо указывать на 0 ордер в списке, а не на OrdersTotal()-1.
OrderSelect(0,SELECT_BY_POS);
double fir_or_pr=OrderOpenPrice();
Это будет первый открытый. Конечно всё это художественная самодеятельность. Если по серьёзному то в 2 строчки не уложиться.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
25.11.2012, 15:39
Аватар для Алекc1234
Алекc1234 Алекc1234 вне форума Местный житель
Регистрация: 24.03.2011 / Сообщений: 697
Поблагодарили 276 раз(а) / Репутация: 276
Конечно это последний. Для первого надо указывать на 0 ордер в списке, а не на OrdersTotal()-1.
OrderSelect(0,SELECT_BY_POS);
double fir_or_pr=OrderOpenPrice();
Это будет первый открытый. Конечно всё это художественная самодеятельность. Если по серьёзному то в 2 строчки не уложиться.
Спасибо, но всё равно не работает. Я выложил весь кусок куда, может, если что-нибудь исправить, заработает?
25.11.2012, 15:45
Аватар для alexshell
alexshell alexshell на форуме Элитный участник
Регистрация: 29.10.2010 / Сообщений: 681
Поблагодарили 1,686 раз(а) / Репутация: 1688
Сообщение от: Алекc1234
Спасибо, но всё равно не работает. Я выложил весь кусок куда, может, если что-нибудь исправить, заработает?
Сделайте так:
datetime Times=TimeCurrent( ) ;// ставите перед циклом
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);

if(OrderOpenTime<Times)
{
double fir_or_pr=OrderOpenPrice();
Times=OrderOpenTime( ) ;
}
на выходе цикла будет цена первого по времени ордера.
25.11.2012, 16:26
Аватар для alexshell
alexshell alexshell на форуме Элитный участник
Регистрация: 29.10.2010 / Сообщений: 681
Поблагодарили 1,686 раз(а) / Репутация: 1688
Да ещё цикл надо делать по открытым ордерам.
25.11.2012, 16:33
Регистрация: 13.03.2009 / Сообщений: 2,360
Поблагодарили 1,966 раз(а) / Репутация: 2043
Сообщение от: Алекc1234
Спасибо, но всё равно не работает. Я выложил весь кусок куда, может, если что-нибудь исправить, заработает?
Я уже писал раньше что надо при выборе указывать что среди открытых ордеров MODE_TRADES
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
25.11.2012, 16:54
Аватар для Алекc1234
Алекc1234 Алекc1234 вне форума Местный житель
Регистрация: 24.03.2011 / Сообщений: 697
Поблагодарили 276 раз(а) / Репутация: 276
Спасибо всем, вот как сейчас выглядит код, но всё равно не работает:
double prof;
datetime Times=TimeCurrent();
double fir_or_pr;

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
if (OrderOpenTime()<Times)
{
fir_or_pr=OrderOpenPrice();
Times=OrderOpenTime();
}
if(OrderType() == OP_BUY)
{
prof = NormalizeDouble((Bid-fir_or_pr),Digits)/Point; }
if (OrderType() == OP_SELL)
{
prof = NormalizeDouble((fir_or_pr-Ask),Digits)/Point; }
25.11.2012, 17:17
Аватар для Алекc1234
Алекc1234 Алекc1234 вне форума Местный житель
Регистрация: 24.03.2011 / Сообщений: 697
Поблагодарили 276 раз(а) / Репутация: 276
Ещё добавлю, что при открытии второго рыночного ордера в рынке находится один отложенный стоп ордер...
25.11.2012, 17:34
Аватар для alexshell
alexshell alexshell на форуме Элитный участник
Регистрация: 29.10.2010 / Сообщений: 681
Поблагодарили 1,686 раз(а) / Репутация: 1688
Сообщение от: Алекc1234
Ещё добавлю, что при открытии второго рыночного ордера в рынке находится один отложенный стоп ордер...
Так всё таки что вы в итоге ищете профит первого по времени ордера? или цену. И у вас одновременно могут быть ордера и бай и селл? А у вас вообще сам цикл то есть? типа for(......).

Последний раз редактировалось alexshell; 25.11.2012 в 17:49.
25.11.2012, 17:46
Регистрация: 13.03.2009 / Сообщений: 2,360
Поблагодарили 1,966 раз(а) / Репутация: 2043
Сообщение от: Алекc1234
Ещё добавлю, что при открытии второго рыночного ордера в рынке находится один отложенный стоп ордер...
Может, для начала стоит ознакомиться с учебником? Метод научного тыка не очень подходит для изучения языка программирования.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
25.11.2012, 18:15
Аватар для Алекc1234
Алекc1234 Алекc1234 вне форума Местный житель
Регистрация: 24.03.2011 / Сообщений: 697
Поблагодарили 276 раз(а) / Репутация: 276
Так всё таки что вы в итоге ищете профит первого по времени ордера? или цену. И у вас одновременно могут быть ордера и бай и селл? А у вас вообще сам цикл то есть? типа for(......).
Ищу профит первого по времени ордера. Одновременно могут быть и бай и селл, но такое бывает редко. Цикл сделал такой
for (int j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS,MODE_TRADES))
{

Последний раз редактировалось Алекc1234; 25.11.2012 в 18:21.
25.11.2012, 18:19
Аватар для Алекc1234
Алекc1234 Алекc1234 вне форума Местный житель
Регистрация: 24.03.2011 / Сообщений: 697
Поблагодарили 276 раз(а) / Репутация: 276
Может, для начала стоит ознакомиться с учебником? Метод научного тыка не очень подходит для изучения языка программирования.
Тут Вы абсолютно правы. Но у меня лучше получается придумывать идеи, чем учится с нуля, как их воплощать в коде. Мне этот сов сделали по моей задумке и потом отвалили, поэтому хочу кое-какие изменения внести, но учиться для этого с чистого листа - это для меня слишком сложно. Так что не взыщите, если кого-то сильно напрягаю...
25.11.2012, 18:26
Регистрация: 13.03.2009 / Сообщений: 2,360
Поблагодарили 1,966 раз(а) / Репутация: 2043
Сообщение от: Алекc1234
Тут Вы абсолютно правы. Но у меня лучше получается придумывать идеи, чем учится с нуля, как их воплощать в коде. Мне этот сов сделали по моей задумке и потом отвалили, поэтому хочу кое-какие изменения внести, но учиться для этого с чистого листа - это для меня слишком сложно. Так что не взыщите, если кого-то сильно напрягаю...
Тогда стоит найти другого программиста для переделки. Есть же ветка по доработке советников. Надо там выложить советник с подробным описанием что надо изменить. Может кто нибудь и переделает.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
25.11.2012, 18:55
Аватар для alexshell
alexshell alexshell на форуме Элитный участник
Регистрация: 29.10.2010 / Сообщений: 681
Поблагодарили 1,686 раз(а) / Репутация: 1688
Сообщение от: Алекc1234
Ищу профит первого по времени ордера.
PHP код:
 double prof;
 
datetime Times=TimeCurrent();
 for( 
int i=0i<OrdersTotal(); i++) 
 {
  if(
OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
  if (
OrderOpenTime()<Times)
   {
    
prof OrderProfit( ) ;
  
    
Times=OrderOpenTime();
   }
  } 
Если вам не важно бай это или селл и какой символ.Проверку по символу сами добавите.

Последний раз редактировалось alexshell; 25.11.2012 в 19:00.
25.11.2012, 19:09
Аватар для Алекc1234
Алекc1234 Алекc1234 вне форума Местный житель
Регистрация: 24.03.2011 / Сообщений: 697
Поблагодарили 276 раз(а) / Репутация: 276
PHP код:
 double prof;
 
datetime Times=TimeCurrent();
 for( 
int i=0i<OrdersTotal(); i++) 
 {
  if(
OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
  if (
OrderOpenTime()<Times)
   {
    
prof OrderProfit( ) ;
  
    
Times=OrderOpenTime();
   }
  } 
Если вам не важно бай это или селл.
Спасибо большое, только я ищу профит в пунктах, а не в валюте. Сделал так, но опять не получилось
double prof;
datetime Times=TimeCurrent();
for( int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()<Times)
{
double fir_or_pr=OrderOpenPrice();

if(ot == OP_BUY)
{
prof = NormalizeDouble((Bid-fir_or_pr),Digits)/Point; }
if (ot == OP_SELL)
{
prof = NormalizeDouble((fir_or_pr-Ask),Digits)/Point; }

Times=OrderOpenTime();
}
}
25.11.2012, 19:12
Аватар для Алекc1234
Алекc1234 Алекc1234 вне форума Местный житель
Регистрация: 24.03.2011 / Сообщений: 697
Поблагодарили 276 раз(а) / Репутация: 276
Тогда стоит найти другого программиста для переделки. Есть же ветка по доработке советников. Надо там выложить советник с подробным описанием что надо изменить. Может кто нибудь и переделает.
Дело-то в том, что нужно только это переделать, всё остальное нормально.
25.11.2012, 20:29
Аватар для alexshell
alexshell alexshell на форуме Элитный участник
Регистрация: 29.10.2010 / Сообщений: 681
Поблагодарили 1,686 раз(а) / Репутация: 1688
Сообщение от: Алекc1234
Спасибо большое, только я ищу профит в пунктах, а не в валюте. Сделал так, но опять не получилось
double prof;
datetime Times=TimeCurrent();
for( int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()<Times)
{
double fir_or_pr=OrderOpenPrice();

if(ot == OP_BUY)
{
prof = NormalizeDouble((Bid-fir_or_pr),Digits)/Point; }
if (ot == OP_SELL)
{
prof = NormalizeDouble((fir_or_pr-Ask),Digits)/Point; }

Times=OrderOpenTime();
}
}
PHP код:
double fir_or_pr;
 
double prof;
 
datetime Times=TimeCurrent();
 
for( 
int i=0i<OrdersTotal(); i++) 
 { if(
OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&&OrderSymbol() ==  Symbol()) 
  { if (
OrderOpenTime()<Times)
    { 
fir_or_pr=OrderOpenPrice();
      if(
OrderType() == OP_BUY) { 
      
prof NormalizeDouble((Bid-fir_or_pr),Digits)/Point; }
      if(
OrderType() == OP_SELL) {
      
prof NormalizeDouble((fir_or_pr-Ask),Digits)/Point; } 
      
Times=OrderOpenTime();
    }
  }
 } 
И не говорите что не работает. Специально в советник вставлял для проверки.Если проверка по символу не нужна уберите её.
Ответить

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


Опции темы

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

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



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


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