• Я тут не случайно
  • Регистрация: 15.04.2006
  • Адрес: Ekaterinburg
  • Сообщений: 14
  • Вес репутации: 0
  • nss777 пока не замечен публикой (0)
здравствуйте.
у меня таже проблема как у Fox


обьясню суть идеи:выставляются два лимитированных ордера
после срабатывания одного из них второй отменяется и выставляется
ордер BUY(SELL)STOP(на случай если сработает стоп).

вот код


tiket1=OrderSend(Symbol(),OP_BUYLIMIT,Lots,l,3,l-Ts*Point,0,"day",16384,0,Blue);
tiket2=OrderSend(Symbol(),OP_SELLLIMIT,Lots,h,3,h+ Ts*Point,0,"day",16384,0,Red);


//+------------------------------------------------------------------+
// БЛОК-2
// Проверка установленных ордеров...
//+------------------------------------------------------------------+
if(OrdersTotal()>=1)
{
for(cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);//перебираем ордера

if(OrderType()==OP_BUY) // т.е. сработал BUYLIMIT
{
tiket3=OrderSend(Symbol(),OP_SELLSTOP,Lots,l-Ts*Point,3,0,0,"day",16384,0,Red);
OrderDelete(tiket2); // закрываем SELLLIMIT
}

if(OrderType()==OP_SELL)// т.е. сработал SELLLIMIT
{
tiket4=OrderSend(Symbol(),OP_BUYSTOP,Lots,h+Ts*Poi nt,3,0,0,"day",16384,0,Blue);
OrderDelete(tiket1); // закрываем BUYLIMIT
}
}
}

почемуто при срабатывании ордеров новые не выставляются
и старые не отменяются(при тестировании в терминале в журнале
пишет invalid price, invalid ticket хотя с ценой и тикетом проблем
не должно быть это легко проверить-если убрать символ вложенного
оператора {} то ордера срабатывают правда независимо от состояния предыдущих ордеров )

и еще (для NewTartan)- какой способом можно определить активный ордер?

P.S. пока пробую вставить в программу код с массивами.
  • Аватар для Rosh
  • Модератор
  • Регистрация: 27.07.2004
  • Адрес: MetaQuotes
  • Сообщений: 5,744
  • Вес репутации: 797
  • Rosh на пути к популярности (50)

Сообщение от nss777:

здравствуйте.
у меня таже проблема как у Fox


обьясню суть идеи:выставляются два лимитированных ордера
после срабатывания одного из них второй отменяется и выставляется
ордер BUY(SELL)STOP(на случай если сработает стоп).

вот код


tiket1=OrderSend(Symbol(),OP_BUYLIMIT,Lots,l,3,l-Ts*Point,0,"day",16384,0,Blue);
tiket2=OrderSend(Symbol(),OP_SELLLIMIT,Lots,h,3,h+ Ts*Point,0,"day",16384,0,Red);


//+------------------------------------------------------------------+
// БЛОК-2
// Проверка установленных ордеров...
//+------------------------------------------------------------------+
if(OrdersTotal()>=1)
{
for(cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);//перебираем ордера

if(OrderType()==OP_BUY) // т.е. сработал BUYLIMIT
{
tiket3=OrderSend(Symbol(),OP_SELLSTOP,Lots,l-Ts*Point,3,0,0,"day",16384,0,Red);
OrderDelete(tiket2); // закрываем SELLLIMIT
}

if(OrderType()==OP_SELL)// т.е. сработал SELLLIMIT
{
tiket4=OrderSend(Symbol(),OP_BUYSTOP,Lots,h+Ts*Poi nt,3,0,0,"day",16384,0,Blue);
OrderDelete(tiket1); // закрываем BUYLIMIT
}
}
}

почемуто при срабатывании ордеров новые не выставляются
и старые не отменяются(при тестировании в терминале в журнале
пишет invalid price, invalid ticket хотя с ценой и тикетом проблем
не должно быть это легко проверить-если убрать символ вложенного
оператора {} то ордера срабатывают правда независимо от состояния предыдущих ордеров )

и еще (для NewTartan)- какой способом можно определить активный ордер?

P.S. пока пробую вставить в программу код с массивами.
Прежде , чем всовывать в торговые функции параметры (номер тикета для удаления или цена открытия для установки отложенного ордера) неплохо было бы сделать распринтовку этих самых параметров, например так:
Код:
 if(OrderType()==OP_BUY) // т.е. сработал BUYLIMIT
 {
Print("Пытаемся выставить SELLSTOP по цене ",l-Ts*Point," текущий Bid=",Bid );
tiket3=OrderSend(Symbol(),OP_SELLSTOP,Lots,l-Ts*Point,3,0,0,"day",16384,0,Red);
Print("Удаляем ордер SELLLIMIT №",ticket2);
OrderDelete(tiket2); // закрываем SELLLIMIT
 }
ПОсле прогона в тестере осмысливаем бессмылицу и пытаемся понять - кто виноват и что делать.
  • Я тут не случайно
  • Регистрация: 15.04.2006
  • Адрес: Ekaterinburg
  • Сообщений: 14
  • Вес репутации: 0
  • nss777 пока не замечен публикой (0)
[quote=Rosh]Прежде , чем всовывать в торговые функции параметры (номер тикета для удаления или цена открытия для установки отложенного ордера) неплохо было бы сделать распринтовку этих самых параметров


сделал распринтовку...
пишет тикет-0, прайс-0,005.
как я понял таким образом внутри оператора тикеттам и установленным
ценовым уровням h и l присваеваются значения - 0
что делать и кто виноват не знаю...
кстати почитал вашу статью "ордера в метатрейдере"
хорошая статья все понятно и доступно.
попробовал немного изменить код но результат тот же...
вот код

//+------------------------------------------------------------------+
//| Day.mq4 |
//|
//|
//+------------------------------------------------------------------+

extern double Lots=1;
extern double Ts=50;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{

int cnt, tiket1, tiket2, tiket3, tiket4;

if(Bars<100)
{
Print("bars less than 100");
return(0);
}
//+------------------------------------------------------------------+
//БЛОК-1
//Выставляем ордера
//+------------------------------------------------------------------+
if(OrdersTotal()<1)
{
if(Hour()==0&&Minute()>1)//время по МТ больше чем 00.01 т.е.начался новый день
{
double h=iHigh(NULL,PERIOD_D1,1);//задаем уровни по предыдущему дню
double l=iLow(NULL,PERIOD_D1,1);

tiket1=OrderSend(Symbol(),OP_BUYLIMIT,Lots,l,3,l-Ts*Point,0,"day",16384,0,Blue);
tiket2=OrderSend(Symbol(),OP_SELLLIMIT,Lots,h,3,h+ Ts*Point,0,"day",16384,0,Red);

}
}
//+------------------------------------------------------------------+
// БЛОК-2
// Проверка установленных ордеров...
//+------------------------------------------------------------------+
if(OrdersTotal()>=1)
{
int buys=0,sells=0;
for(cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);//перебираем ордера
if(OrderType()==OP_BUY) {buys++;}
if(OrderType()==OP_SELL) {sells++;}
}
}
Print("buys",buys);
Print("sells",sells);
if(buys>0) // т.е. сработал BUYLIMIT
{
Print("Пытаемся выставить SELLSTOP по цене ",l-Ts*Point," текущий Bid=",Bid );
tiket3=OrderSend(Symbol(),OP_SELLSTOP,Lots,l-Ts*Point,3,l,0,"day",16384,0,Red);
Print("Удаляем ордер SELLLIMIT №",tiket2);
OrderDelete(tiket2); // закрываем SELLLIMIT
}
if(sells>0) // т.е. сработал SELLLIMIT
{
Print("Пытаемся выставить BUYSTOP по цене ",h+Ts*Point," текущий Bid=",Ask );
tiket4=OrderSend(Symbol(),OP_BUYSTOP,Lots,h+Ts*Poi nt,3,h,0,"day",16384,0,Blue);
Print("Удаляем ордер BUYLIMIT №",tiket1);
OrderDelete(tiket1); // закрываем BUYLIMIT
}
}
  • Аватар для Rosh
  • Модератор
  • Регистрация: 27.07.2004
  • Адрес: MetaQuotes
  • Сообщений: 5,744
  • Вес репутации: 797
  • Rosh на пути к популярности (50)
Обрати внимание в блоке start() на каждом тике объявляем переменные:
Код:
 //+------------------------------------------------------------------+
 //|                                                                  |
 //+------------------------------------------------------------------+
 int start()
   {
    
int cnt, tiket1, tiket2, tiket3, tiket4;
, которые( я начал юы по крайней мере подозревать) с каждым тиком порождаются новые и каким они были на предыдущем тике - никто уже не скажет.
Решений два:
1. вынести объявление этих переменных в интерфейсную часть, сразу после extern переменных , но этот путь по моему мнению плох.
2. На каждом тике сначала проверяем наличие открытых ордеров, находим тикеты отложенных ордеров и потому уже эти тикеты предлагаем функции OderDelete()
  • Аватар для Rosh
  • Модератор
  • Регистрация: 27.07.2004
  • Адрес: MetaQuotes
  • Сообщений: 5,744
  • Вес репутации: 797
  • Rosh на пути к популярности (50)
Далее вставляем распринтовку в Блок-1 и Блок-2
Код:
  //+------------------------------------------------------------------+
  //БЛОК-1
  //Выставляем ордера
  //+------------------------------------------------------------------+
  if(OrdersTotal()<1)
  {    
  if(Hour()==0&&Minute()>1)//время по МТ больше чем 00.01 т.е.начался новый день
    {     
 Print("Выполняется БЛОК-1");
  double h=iHigh(NULL,PERIOD_D1,1);//задаем уровни по предыдущему дню
  double l=iLow(NULL,PERIOD_D1,1);
  
  tiket1=OrderSend(Symbol(),OP_BUYLIMIT,Lots,l,3,l-Ts*Point,0,"day",16384,0,Blue);
  tiket2=OrderSend(Symbol(),OP_SELLLIMIT,Lots,h,3,h+  Ts*Point,0,"day",16384,0,Red);
  
    }
  }
и начинаем после прогона в тестере понимать всю порочность объявления переменных h и l в условном опереаторе if().

Последний раз редактировалось Rosh; 20.04.2006 в 18:32.

  • Аватар для GameOver
  • Прописавшийся
  • Регистрация: 14.09.2005
  • Сообщений: 334
  • Вес репутации: 215
  • GameOver пока не замечен публикой (0)

Сообщение от nss777:

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);//перебираем ордера
все жду, когда сам додумаешься..
ТАК ДЕЛАТЬ НЕЛЬЗЯ
ты не проверяешь, выбрал ли ты ордер

смотри ссылки..
надо
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)){
//перебираем ордера
}

внимательней...
Никаких крыльев нету. Просто умираешь и все. (гусеница)
  • Аватар для Rosh
  • Модератор
  • Регистрация: 27.07.2004
  • Адрес: MetaQuotes
  • Сообщений: 5,744
  • Вес репутации: 797
  • Rosh на пути к популярности (50)
Индикаторы по статье 15. Перевод индикатора из MQL-2 в MQL-4 .
  • Вложения

Последний раз редактировалось Rosh; 22.04.2006 в 15:31.

  • Я тут не случайно
  • Регистрация: 15.04.2006
  • Адрес: Ekaterinburg
  • Сообщений: 14
  • Вес репутации: 0
  • nss777 пока не замечен публикой (0)
[quote=Rosh]Далее вставляем распринтовку в Блок-1 и Блок-2
и начинаем после прогона в тестере понимать всю порочность объявления переменных h и l в условном опереаторе if().


Теперь все стало ясно и понятно...
ошибку понял,исправил,все заработало.....вопрос снят.
ОГРОМНОЕ СПАСИБО за помощь.

П.С. Кстати как один из вариантов внес все переменные в массивы и
потом их оттуда вынимал:также все работает...
  • Я тут не случайно
  • Регистрация: 15.04.2006
  • Адрес: Ekaterinburg
  • Сообщений: 14
  • Вес репутации: 0
  • nss777 пока не замечен публикой (0)
[quote=GameOver]
в приведенном коде это еще не последняя ошибка,там еще мудренее завал есть.Правда теперь уже все исправил.
БЛАГОДАРЮ за помощь.
  • Аватар для SoMax
  • Я тут случайно
  • Регистрация: 05.02.2006
  • Адрес: Таганрог
  • Сообщений: 9
  • Вес репутации: 0
  • SoMax пока не замечен публикой (0)
Я тут написал скрипт на примере урока 6. Он показывает значение CCI, RSI и Stochastic на пересечении двух скользящих, почему на некоторых парах в графе Close показывается нормальная цена, а на некоторых например eurusd выводятся даты?.
Правило трейдера: проиграл квартиру матери - остановись!

Последний раз редактировалось SoMax; 24.04.2006 в 19:03.

Ваши права в разделе

Опции темы
Опции просмотра