Пожалуйста помогите разобраться с этим !

 

Вот ниже приведен код. Дело в том что при открытии бара должны открываться ордера (Вроде как правильно написал !). Иногда когда я включаю советник он то вроде работает - но бывает такое что ордера могут два открыться (тоесть так и нужно), бывает такое что один ордер откроется, а на второй выдает ошибку 129 (неправильная цена), бывает такое что со всем не тот не тот не откроется. Вопрос в следующем заключается что это за ошибка 129 - как понимать что такое не правильная цена, от чего это может завысить и как с ним бороться. И ответьте по поводу того - почему ордера могут не открыться совсем - почему они не открываются (Они же должны открыться при открытии бара). Пожалуйста помогите разобраться с этим.


if(Volume[0]>1)

return;

Open_buy = OrderSend(Symbol(),OP_BUY,1.00,Ask,3,0,0,"",1,0,Blue);
RefreshRates();
Open_sell = OrderSend(Symbol(),OP_SELL,1.00,Bid,3,0,0,"",1,0,Red);

if(Open_buy<0)
{
Print(" --------- OrderSend Open_buy failed with ERROR #",GetLastError());
return(0);
}

if(Open_sell<0)
{
Print(" --------- OrderSend Open_sell failed with ERROR #",GetLastError());
return(0);
}
 

Событие на открытие бара лучше отслеживать по времени я лично использую вот такую функцию:

bool isNewBar(int timeFrame)
{
bool res=false;

// массив содержит время открытия текущего (нулевого) бара
// по 7 (семь) таймфреймам
static datetime _sTime[7];
int i=6;

switch (timeFrame)
{
case 1 : i=0; break;
case 5 : i=2; break;
case 15 : i=3; break;
case 30 : i=4; break;
case 60 : i=5; break;
case 240: i=6; break;
case 1440: i=7; break;
default: timeFrame = 1440;
}
//----
if (_sTime[i]==0 || _sTime[i]!=iTime(Symbol(),timeFrame,0))
{
_sTime[i] = iTime(Symbol(),timeFrame,0);
res=true;
}

//----
return(res);
}

Функцию RefreshRates(); лучше поставить перед

 
Пожалуйста помогите разобраться с этим !
 

Может вместо этого-

if(Volume[0]>1)
return;

Использовать что-ниб. попроще ? Например :

if (Time[0] == prevtime) return(0); // ждем появления нового бара
   prevtime = Time[0]; // если появился новый бар 

//открываем позиции .... ....
 

Только надо в глоб. переменным сначала задать

static int prevtime = 0;
 
rovlent:

Вот ниже приведен код. Дело в том что при открытии бара должны открываться ордера (Вроде как правильно написал !). Иногда когда я включаю советник он то вроде работает - но бывает такое что ордера могут два открыться (тоесть так и нужно), бывает такое что один ордер откроется, а на второй выдает ошибку 129 (неправильная цена), бывает такое что со всем не тот не тот не откроется. Вопрос в следующем заключается что это за ошибка 129 - как понимать что такое не правильная цена, от чего это может завысить и как с ним бороться. И ответьте по поводу того - почему ордера могут не открыться совсем - почему они не открываются (Они же должны открыться при открытии бара). Пожалуйста помогите разобраться с этим.

if(Volume[0]>1)

return;

Open_buy = OrderSend(Symbol(),OP_BUY,1.00,Ask,3,0,0,"",1,0,Blue);
RefreshRates();
Open_sell = OrderSend(Symbol(),OP_SELL,1.00,Bid,3,0,0,"",1,0,Red);

if(Open_buy<0)
{
Print(" --------- OrderSend Open_buy failed with ERROR #",GetLastError());
return(0);
}

if(Open_sell<0)
{
Print(" --------- OrderSend Open_sell failed with ERROR #",GetLastError());
return(0);
}

Слишком простой код!

тут будут ошибки!

код не может быть таким простым!

гаранитии у такого кода на открытие нет никакой

Для начала посмотрите коды у Игоря Ким

посмотрите коды в CODEBASE

особенно уделите силы и время на обработку ошибок

суть такая ФУНКЦИЯ открытия вернула ошибку ! ее анализ возможно программный рекконект

и попытка откыть заново!

и так минимум раза 3

кроме того поиск нового бара по Volume[0] > 1 как то не очень хорошо

мне кажется лучше искать по времени

---

ваша ошибка 129 возникает из за того что открытие идет не корректно т е по старой цене

как минимум делайте RefreshRates()

перед каждым расчетом стопов тейков и получением Ask Bid

---

 

ваша ошибка 129 возникает из за того что открытие идет не корректно т е по старой цене

как минимум делайте RefreshRates()

перед каждым расчетом стопов тейков и получением Ask Bid

Обратите внимание, что в коде есть RefreshRates() перед открытием второго ордера!

 
Integer:

ваша ошибка 129 возникает из за того что открытие идет не корректно т е по старой цене

как минимум делайте RefreshRates()

перед каждым расчетом стопов тейков и получением Ask Bid

Обратите внимание, что в коде есть RefreshRates() перед открытием второго ордера!

да я видел

перед первым она тоже не помешает

ведь неизвестно сколько по коду и как долго бродил "казазатель" пока не дошел до первого OrderSend

( код ведь не полный приведен а только кусок )

может Ask устарел а новый тик прога не словила по причине что не успела выйти из Start

129 ошибка может появиться ведь даже если тик словился

просто цены успели улететь пока приказ пришел на сервер

нужна обработка повторного входа!

конечно если расчетные значения условий входа пересчитанные после ошибки 129 позволяют еще войти

 
То есть я так понимаю лутше искать открытие бара по времени ! Я правильно понял. А как бить с тем что иногда ордера открываются. И еще я не дописал - когда ордер открывается должно писать вот такое сообщение Print(" --------- OrderSend Open_buy is successful !); а если нет то Print(" --------- OrderSend Open_buy failed with ERROR #",GetLastError());. Но понимаете когда ордера не открываются не выводится не то, не то сообщение ли бо как я уже говорил 129. Такое чувство что этот код совсем не обрабатывается когда не открываются ордера - нет ни каких сообщений и ошибок.


if(Volume[0]>1)

return;

Open_buy = OrderSend(Symbol(),OP_BUY,1.00,Ask,3,0,0,"",1,0,Blue);
RefreshRates();
Open_sell = OrderSend(Symbol(),OP_SELL,1.00,Bid,3,0,0,"",1,0,Red);

if(Open_buy<0)
{
Print(" --------- OrderSend Open_buy failed with ERROR #",GetLastError());
return(0);

}

else

{

Print(" --------- OrderSend Open_buy is successful !);

}

if(Open_sell<0)
{
Print(" --------- OrderSend Open_sell failed with ERROR #",GetLastError());
return(0);

}

else

{

Print(" --------- OrderSend Open_buy is successful !);

}

 

rovlent писал (а):
То есть я так понимаю лутше искать открытие бара по времени ! Я правильно понял. А как бить с тем что иногда ордера открываются. И еще я не дописал - когда ордер открывается должно писать вот такое сообщение Print(" --------- OrderSend Open_buy is successful !); а если нет то Print(" --------- OrderSend Open_buy failed with ERROR #",GetLastError());. Но понимаете когда ордера не открываются не выводится не то, не то сообщение ли бо как я уже говорил 129. Такое чувство что этот код совсем не обрабатывается когда не открываются ордера - нет ни каких сообщений и ошибок.



я откоментирую Ваш текст! - в слудующий раз пользуетесь вставкой кода SCR на экранчике у вас есть вверхнем меню при редактировании

if(Volume[0]>1) --- ТАК ТОЖЕ БУДЕТ КОНЕЧНО ЛОВИТЬ ПЕРВЫЙ БАР

return;
Open_buy = OrderSend(Symbol(),OP_BUY,1.00,Ask,3,0,0,"",1,0,Blue); RefreshRates(); Open_sell = OrderSend(Symbol(),OP_SELL,1.00,Bid,3,0,0,"",1,0,Red); if(Open_buy<0) { Print(" --------- OrderSend Open_buy failed with ERROR #",GetLastError()); --- ВЕРНО В СЛУЧАЕ ОШИБКИ ПРИЙДЕТ СЮДА return(0); } else { Print(" --------- OrderSend Open_buy is successful !); -- В СЛУЧАЕ КОГДА ВСЕ ХОРОШО СЮДА }

иного пути у программы нет!


if(Open_sell<0)
{
Print(" --------- OrderSend Open_sell failed with ERROR #",GetLastError());
return(0);

}

else

{

Print(" --------- OrderSend Open_buy is successful !);

}

пожалуйста покажите куда прийдет "указатель кода" ? в описанном Вами случае: Но понимаете когда ордера не открываются не выводится не то, не то сообщение

правильно! тут у вас нет третьего пути для кода!

тут вы явно ошиблись

у вас ПО КОДУ

не ДОЛЖНО БЫТЬ третьего варианта - когда ничего не печатается

1 или открывается ордер и печатается что все хорошо

2 или печатается сообщение об ошибке!

---

тут логика простая и если возник ПЕРВЫЙ ТИК в начало бара! то код должен обработаться и печать будет либа та либо другая

вы наверно путаетесь! НА ВТОРОМ ТИКЕ программа ничего уже не сделает и не напечатает и не откроет

но на первом тике попытка открыть и печать неизбежна

 

У меня еще такой вопрос. Напишите свой собственный код когда б при открытии бара открывались ордера !! УВАЖАЕМЫЕ ТРЕЙДЕРЫ ПОМОГИТЕ НАПИСАТЬ КОД !!!

И еще то что писал rid не работает так как нужно.



static int prevtime = 0; // Только надо в глоб. переменным сначала задать
 
if (Time[0] == prevtime) return(0); // ждем появления нового бара
   prevtime = Time[0]; // если появился новый бар 
 
//открываем позиции .... ....

Дало в том что как только я включаю советник тут же начинают открываться ордера (по середине бара, на на вершине и т.д)! Мне не ну нужно что бы уже на существующем баре отрывались ордера. А нужно как только появился новий бар открыть ордера.


if(Volume[0]>1)
return;
 
RefreshRates();
Open_buy = OrderSend(Symbol(),OP_BUY,1.00,Ask,3,0,0,"",1,0,Blue);
RefreshRates();
Open_sell = OrderSend(Symbol(),OP_SELL,1.00,Bid,3,0,0,"",1,0,Red);
 
if(Open_buy<0)
{
Print(" --------- OrderSend Open_buy failed with ERROR #",GetLastError());
return(0);
}
 
if(Open_sell<0)
{
Print(" --------- OrderSend Open_sell failed with ERROR #",GetLastError());
return(0);
}

Как уже писали нужно било поставить

RefreshRates();

Я поставил -- но не работает так ка нужно. То вовсе не открываются ордера - то ошибка 129 !!!

Причина обращения: