- #101
- 20.04.2006, 09:30
- Я тут не случайно
- Регистрация: 15.04.2006
- Адрес: Ekaterinburg
- Сообщений: 14
- Вес репутации: 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. пока пробую вставить в программу код с массивами.
- #103
- 20.04.2006, 16:06
- Я тут не случайно
- Регистрация: 15.04.2006
- Адрес: Ekaterinburg
- Сообщений: 14
- Вес репутации: 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
}
}
- #105
- 20.04.2006, 16:46

- Модератор
- Регистрация: 27.07.2004
- Адрес: MetaQuotes
- Сообщений: 5,744
- Вес репутации: 797

-
Далее вставляем распринтовку в Блок-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.
- #106
- 21.04.2006, 13:28

- Прописавшийся
- Регистрация: 14.09.2005
- Сообщений: 334
- Вес репутации: 215

-
Сообщение от nss777:
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);//перебираем ордера
все жду, когда сам додумаешься..

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

внимательней...
Никаких крыльев нету. Просто умираешь и все. (гусеница)
- #108
- 23.04.2006, 02:09
- Я тут не случайно
- Регистрация: 15.04.2006
- Адрес: Ekaterinburg
- Сообщений: 14
- Вес репутации: 0

-
[quote=Rosh]Далее вставляем распринтовку в Блок-1 и Блок-2
и начинаем после прогона в тестере понимать всю порочность объявления переменных h и l в условном опереаторе if().
Теперь все стало ясно и понятно...
ошибку понял,исправил,все заработало.....вопрос снят.
ОГРОМНОЕ СПАСИБО за помощь.
П.С. Кстати как один из вариантов внес все переменные в массивы и
потом их оттуда вынимал:также все работает...
- #109
- 23.04.2006, 02:20
- Я тут не случайно
- Регистрация: 15.04.2006
- Адрес: Ekaterinburg
- Сообщений: 14
- Вес репутации: 0

-
[quote=GameOver]
в приведенном коде это еще не последняя ошибка,там еще мудренее завал есть.Правда теперь уже все исправил.
БЛАГОДАРЮ за помощь.
- #110
- 24.04.2006, 17:52

- Я тут случайно
- Регистрация: 05.02.2006
- Адрес: Таганрог
- Сообщений: 9
- Вес репутации: 0

-
Я тут написал скрипт на примере урока 6. Он показывает значение CCI, RSI и Stochastic на пересечении двух скользящих, почему на некоторых парах в графе Close показывается нормальная цена, а на некоторых например eurusd выводятся даты?.
Правило трейдера: проиграл квартиру матери - остановись!
Последний раз редактировалось SoMax; 24.04.2006 в 19:03.