Ответ
 
Опции темы
Старый 25.11.2012, 09:07   #561 (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 Посмотреть сообщение
У меня следующая ситуация. Совок ставит в определённое время, а точнее, по закрытия свечи на 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); 
eevviill вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 13:34   #562 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Сообщение от eevviill Посмотреть сообщение
Ну так всё правильно. Советник будет на открытии свечи проверять условия. Или тебе надо открыто в 15, проверка на следующий день в 15?
eevviill, у тебя указано, что:
PHP код:
iTime(Symbol(),0,0

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

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

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

Сообщение от eevviill Посмотреть сообщение
Слушай. У меня третий вариант. Очень простой.
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.
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
eevviill (25.11.2012)
Старый 25.11.2012, 14:54   #563 (permalink)
Местный житель
 
Аватар для Алекc1234
 
Регистрация: 24.03.2011
Сообщений: 697
Репутация: 276
Алекc1234 Алекc1234 Алекc1234
Сказал(а) спасибо: 391
Поблагодарили 276 раз(а) в 176 сообщениях
Поинты: 0
eevviill, никак не могу сделать так, чтобы при открытии нескольких рыночных ордеров, в коде написать цену первого открытого ордера? То есть OderOpenPrice() первого по времени открытого ордера. Сделал, как Вы написали
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
double fir_or_pr=OrderOpenPrice();
но сов видит цену последнего по времени открытого ордера. Можно ли что-нибудь сделать? Может, по другому нужно?
Алекc1234 на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 15:16   #564 (permalink)
Местный житель
 
Аватар для Алекc1234
 
Регистрация: 24.03.2011
Сообщений: 697
Репутация: 276
Алекc1234 Алекc1234 Алекc1234
Сказал(а) спасибо: 391
Поблагодарили 276 раз(а) в 176 сообщениях
Поинты: 0
Делаю так(подобно приведённому выше коду)
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; }
}
Но всё равно сов не видит цену первого открытого ордера, а смотрит на последнюю цену.
Алекc1234 на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 15:17   #565 (permalink)
Элитный участник
 
Аватар для Ugar
 
Регистрация: 13.03.2009
Сообщений: 2,254
Репутация: 1963
Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar
Сказал(а) спасибо: 349
Поблагодарили 1,892 раз(а) в 1,069 сообщениях
Поинты: 1274
Отправить сообщение для Ugar с помощью ICQ
Сообщение от Алек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
Чужие программы не переделываю!
Ugar на форуме   Ответить с цитированиемОтветить с цитированием  
2 пользователя(ей) сказали cпасибо:
eevviill (25.11.2012), Алекc1234 (25.11.2012)
Старый 25.11.2012, 15:39   #566 (permalink)
Местный житель
 
Аватар для Алекc1234
 
Регистрация: 24.03.2011
Сообщений: 697
Репутация: 276
Алекc1234 Алекc1234 Алекc1234
Сказал(а) спасибо: 391
Поблагодарили 276 раз(а) в 176 сообщениях
Поинты: 0
Сообщение от Ugar Посмотреть сообщение
Конечно это последний. Для первого надо указывать на 0 ордер в списке, а не на OrdersTotal()-1.
OrderSelect(0,SELECT_BY_POS);
double fir_or_pr=OrderOpenPrice();
Это будет первый открытый. Конечно всё это художественная самодеятельность. Если по серьёзному то в 2 строчки не уложиться.
Спасибо, но всё равно не работает. Я выложил весь кусок куда, может, если что-нибудь исправить, заработает?
Алекc1234 на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 15:45   #567 (permalink)
Элитный участник
 
Аватар для alexshell
 
Регистрация: 29.10.2010
Сообщений: 650
Репутация: 1669
alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell
Сказал(а) спасибо: 917
Поблагодарили 1,667 раз(а) в 584 сообщениях
Поинты: 339
Сообщение от Алекc1234 Посмотреть сообщение
Спасибо, но всё равно не работает. Я выложил весь кусок куда, может, если что-нибудь исправить, заработает?
Сделайте так:
datetime Times=TimeCurrent( ) ;// ставите перед циклом
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);

if(OrderOpenTime<Times)
{
double fir_or_pr=OrderOpenPrice();
Times=OrderOpenTime( ) ;
}
на выходе цикла будет цена первого по времени ордера.
alexshell на форуме   Ответить с цитированиемОтветить с цитированием  
2 пользователя(ей) сказали cпасибо:
eevviill (25.11.2012), Алекc1234 (25.11.2012)
Старый 25.11.2012, 16:26   #568 (permalink)
Элитный участник
 
Аватар для alexshell
 
Регистрация: 29.10.2010
Сообщений: 650
Репутация: 1669
alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell
Сказал(а) спасибо: 917
Поблагодарили 1,667 раз(а) в 584 сообщениях
Поинты: 339
Да ещё цикл надо делать по открытым ордерам.
alexshell на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 16:33   #569 (permalink)
Элитный участник
 
Аватар для Ugar
 
Регистрация: 13.03.2009
Сообщений: 2,254
Репутация: 1963
Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar
Сказал(а) спасибо: 349
Поблагодарили 1,892 раз(а) в 1,069 сообщениях
Поинты: 1274
Отправить сообщение для Ugar с помощью ICQ
Сообщение от Алекc1234 Посмотреть сообщение
Спасибо, но всё равно не работает. Я выложил весь кусок куда, может, если что-нибудь исправить, заработает?
Я уже писал раньше что надо при выборе указывать что среди открытых ордеров MODE_TRADES

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
Ugar на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 16:54   #570 (permalink)
Местный житель
 
Аватар для Алекc1234
 
Регистрация: 24.03.2011
Сообщений: 697
Репутация: 276
Алекc1234 Алекc1234 Алекc1234
Сказал(а) спасибо: 391
Поблагодарили 276 раз(а) в 176 сообщениях
Поинты: 0
Спасибо всем, вот как сейчас выглядит код, но всё равно не работает:
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; }
Алекc1234 на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 17:17   #571 (permalink)
Местный житель
 
Аватар для Алекc1234
 
Регистрация: 24.03.2011
Сообщений: 697
Репутация: 276
Алекc1234 Алекc1234 Алекc1234
Сказал(а) спасибо: 391
Поблагодарили 276 раз(а) в 176 сообщениях
Поинты: 0
Ещё добавлю, что при открытии второго рыночного ордера в рынке находится один отложенный стоп ордер...
Алекc1234 на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 17:34   #572 (permalink)
Элитный участник
 
Аватар для alexshell
 
Регистрация: 29.10.2010
Сообщений: 650
Репутация: 1669
alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell
Сказал(а) спасибо: 917
Поблагодарили 1,667 раз(а) в 584 сообщениях
Поинты: 339
Сообщение от Алекc1234 Посмотреть сообщение
Ещё добавлю, что при открытии второго рыночного ордера в рынке находится один отложенный стоп ордер...
Так всё таки что вы в итоге ищете профит первого по времени ордера? или цену. И у вас одновременно могут быть ордера и бай и селл? А у вас вообще сам цикл то есть? типа for(......).

Последний раз редактировалось alexshell; 25.11.2012 в 17:49.
alexshell на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 17:46   #573 (permalink)
Элитный участник
 
Аватар для Ugar
 
Регистрация: 13.03.2009
Сообщений: 2,254
Репутация: 1963
Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar
Сказал(а) спасибо: 349
Поблагодарили 1,892 раз(а) в 1,069 сообщениях
Поинты: 1274
Отправить сообщение для Ugar с помощью ICQ
Сообщение от Алекc1234 Посмотреть сообщение
Ещё добавлю, что при открытии второго рыночного ордера в рынке находится один отложенный стоп ордер...
Может, для начала стоит ознакомиться с учебником? Метод научного тыка не очень подходит для изучения языка программирования.

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

Последний раз редактировалось Алекc1234; 25.11.2012 в 18:21.
Алекc1234 на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 18:19   #575 (permalink)
Местный житель
 
Аватар для Алекc1234
 
Регистрация: 24.03.2011
Сообщений: 697
Репутация: 276
Алекc1234 Алекc1234 Алекc1234
Сказал(а) спасибо: 391
Поблагодарили 276 раз(а) в 176 сообщениях
Поинты: 0
Сообщение от Ugar Посмотреть сообщение
Может, для начала стоит ознакомиться с учебником? Метод научного тыка не очень подходит для изучения языка программирования.
Тут Вы абсолютно правы. Но у меня лучше получается придумывать идеи, чем учится с нуля, как их воплощать в коде. Мне этот сов сделали по моей задумке и потом отвалили, поэтому хочу кое-какие изменения внести, но учиться для этого с чистого листа - это для меня слишком сложно. Так что не взыщите, если кого-то сильно напрягаю...
Алекc1234 на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 18:26   #576 (permalink)
Элитный участник
 
Аватар для Ugar
 
Регистрация: 13.03.2009
Сообщений: 2,254
Репутация: 1963
Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar
Сказал(а) спасибо: 349
Поблагодарили 1,892 раз(а) в 1,069 сообщениях
Поинты: 1274
Отправить сообщение для Ugar с помощью ICQ
Сообщение от Алекc1234 Посмотреть сообщение
Тут Вы абсолютно правы. Но у меня лучше получается придумывать идеи, чем учится с нуля, как их воплощать в коде. Мне этот сов сделали по моей задумке и потом отвалили, поэтому хочу кое-какие изменения внести, но учиться для этого с чистого листа - это для меня слишком сложно. Так что не взыщите, если кого-то сильно напрягаю...
Тогда стоит найти другого программиста для переделки. Есть же ветка по доработке советников. Надо там выложить советник с подробным описанием что надо изменить. Может кто нибудь и переделает.

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
Ugar на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 18:55   #577 (permalink)
Элитный участник
 
Аватар для alexshell
 
Регистрация: 29.10.2010
Сообщений: 650
Репутация: 1669
alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell
Сказал(а) спасибо: 917
Поблагодарили 1,667 раз(а) в 584 сообщениях
Поинты: 339
Сообщение от Алек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.
alexshell на форуме   Ответить с цитированиемОтветить с цитированием  
2 пользователя(ей) сказали cпасибо:
eevviill (25.11.2012), Алекc1234 (25.11.2012)
Старый 25.11.2012, 19:09   #578 (permalink)
Местный житель
 
Аватар для Алекc1234
 
Регистрация: 24.03.2011
Сообщений: 697
Репутация: 276
Алекc1234 Алекc1234 Алекc1234
Сказал(а) спасибо: 391
Поблагодарили 276 раз(а) в 176 сообщениях
Поинты: 0
Сообщение от alexshell Посмотреть сообщение
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();
}
}
Алекc1234 на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 19:12   #579 (permalink)
Местный житель
 
Аватар для Алекc1234
 
Регистрация: 24.03.2011
Сообщений: 697
Репутация: 276
Алекc1234 Алекc1234 Алекc1234
Сказал(а) спасибо: 391
Поблагодарили 276 раз(а) в 176 сообщениях
Поинты: 0
Сообщение от Ugar Посмотреть сообщение
Тогда стоит найти другого программиста для переделки. Есть же ветка по доработке советников. Надо там выложить советник с подробным описанием что надо изменить. Может кто нибудь и переделает.
Дело-то в том, что нужно только это переделать, всё остальное нормально.
Алекc1234 на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.11.2012, 20:29   #580 (permalink)
Элитный участник
 
Аватар для alexshell
 
Регистрация: 29.10.2010
Сообщений: 650
Репутация: 1669
alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell alexshell
Сказал(а) спасибо: 917
Поблагодарили 1,667 раз(а) в 584 сообщениях
Поинты: 339
Сообщение от Алек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();
    }
  }
 } 
И не говорите что не работает. Специально в советник вставлял для проверки.Если проверка по символу не нужна уберите её.
alexshell на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
Алекc1234 (25.11.2012)
Ответ

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


Опции темы

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

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



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


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