Помогите понять алгоритм.

 

Как реализовать в этом советнике задумку, что бы ---->

Alert

срабатывал один раз, при открытии нового ордера ?

Может там цикл по порядковой позиции ордера сделать? Или не поможет?

int y=0;

int t=0 ;

int start()
{
//----
for (int k=OrdersTotal()-1;k>=0;k--)//Начинаем перебор всех открытых ордеров начиная с конца
{
RefreshRates();//Обновляем котировки, необходимо при модификации или закрытии ордеров
if (OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true&&OrderSymbol()==Symbol())//Выбираем ордер с номером из цикла, и проверяем, совпадает ли символ ордера с текущим
{
int cmd=OrderType();//В переменной cmd будем хранить тип ордера
if(cmd>1)//Нас интересуют только отложенные ордеры
{
//Что-то делаем
}
if (cmd==OP_BUY)//А вдруг на покупку ордер?
{
t=t + 1;

Alert("Новый ордер на покупку "+t);
}
if (cmd==OP_SELL)//Или на продажу?
{
y=y + 1;

Alert("Новый ордер на продажу "+y);

}
}
}
//----
return(0);
}

 
semiromid:

Как реализовать в этом советнике задумку, что бы ---->

Alert (GetLastError());

срабатывал один раз, при открытии нового ордера ?

Может там цикл по порядковой позиции ордера сделать? Или не поможет?



Простейший пример можно сделать

int start(){
  static int PrevOrdersTotal=0;
  int pos=OrdersTotal()-1;
  if (PrevOrdersTotal!=pos) {
    if (OrderSelect(pos, SELECT_BY_POS)) {
      // Ваша обработка
    }
  }
  PrevOrdersTotal=pos;
  return(0);
}

Но нужно еще учитывать и закрытие позиция

 

Если не трудно, опишите сам алгоритм .Просто мне так легче будет написать то что я хочу .

 
semiromid:

Если не трудно, опишите сам алгоритм .Просто мне так легче будет написать то что я хочу .


Сохраняем количество открытых позиций.

На следующем тике проверяем изменилось или нет.

Измениться может в двух случаях.

1. Произошло закрытие позиции.

2. Произошло открытие позиции.

 
Vinin:


Сохраняем количество открытых позиций.

На следующем тике проверяем изменилось или нет.

Измениться может в двух случаях.

1. Произошло закрытие позиции.

2. Произошло открытие позиции.

Так нужно как-то индефицировать индивидуальность открытой позиции, что бы на каждом тике не происходили изменения(Пример:(

Alert (GetLastError());? Или это не обязательно делать?

 
semiromid:


А зачем Alert (GetLastError());?
 
Vinin:

А зачем Alert (GetLastError());?


Можно это

y=y + 1;

Alert("Новый ордер на продажу "+y);

 

int y=0;

int t=0 ;

int start()
{
//----
for (int k=OrdersTotal()-1;k>=0;k--)//Начинаем перебор всех открытых ордеров начиная с конца
{
RefreshRates();//Обновляем котировки, необходимо при модификации или закрытии ордеров
if (OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true&&OrderSymbol()==Symbol())//Выбираем ордер с номером из цикла, и проверяем, совпадает ли символ ордера с текущим
{
int cmd=OrderType();//В переменной cmd будем хранить тип ордера
if(cmd>1)//Нас интересуют только отложенные ордеры
{
//Что-то делаем
}
if (cmd==OP_BUY)//А вдруг на покупку ордер?
{
t=t + 1;

Alert("Новый ордер на покупку "+t);
}
if (cmd==OP_SELL)//Или на продажу?
{
y=y + 1;

Alert("Новый ордер на продажу "+y);

}
}
}
//----
return(0);
}

 
semiromid:

int y=0;

int t=0 ;

int start()
{
//----
for (int k=OrdersTotal()-1;k>=0;k--)//Начинаем перебор всех открытых ордеров начиная с конца
{
RefreshRates();//Обновляем котировки, необходимо при модификации или закрытии ордеров
if (OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true&&OrderSymbol()==Symbol())//Выбираем ордер с номером из цикла, и проверяем, совпадает ли символ ордера с текущим
{
int cmd=OrderType();//В переменной cmd будем хранить тип ордера
if(cmd>1)//Нас интересуют только отложенные ордеры
{
//Что-то делаем
}
if (cmd==OP_BUY)//А вдруг на покупку ордер?
{
t=t + 1;

Alert("Новый ордер на покупку "+t);
}
if (cmd==OP_SELL)//Или на продажу?
{
y=y + 1;

Alert("Новый ордер на продажу "+y);

}
}
}
//----
return(0);
}


А зачем полный перебор. Если бы Вы сохраняли тикеты открытых позиций в массиве, то было бы понятно. А так мы похоже о разном рассуждаем
 
Vinin:

А зачем полный перебор. Если бы Вы сохраняли тикеты открытых позиций в массиве, то было бы понятно. А так мы похоже о разном рассуждаем


Я и имел ввиду может массивы прикрутить .Но теперь понял что это не нужно . Буду тестирывать .Спасибо.Только вот почему не нужно не понял .

Только вот не пойму почему в вашем вареанте не будет срабатывать " // Ваша обработка "

при каждом тике . Что выступает в роли фильтра ? Сравнение и обнуление PrevOrdersTotal=pos;?

static int PrevOrdersTotal=0;
int pos=OrdersTotal()-1;
if (PrevOrdersTotal!=pos) {
if (OrderSelect(pos, SELECT_BY_POS)) {
// Ваша обработка
}
}
PrevOrdersTotal=pos;

 
semiromid:


Я и имел ввиду может массивы прикрутить .Но теперь понял что это не нужно . Буду тестирывать .Спасибо.Только вот почему не нужно не понял .

Только вот не пойму почему в вашем вареанте не будет срабатывать " // Ваша обработка "

при каждом тике . Что выступает в роли фильтра ? Сравнение и обнуление PrevOrdersTotal=pos;?


Лучше наверно все-таки сделать малость по другому

Корректнее будет

static int PrevOrdersTotal=-1;
int pos=OrdersTotal()-1;
if (PrevOrdersTotal<pos) {
  if (OrderSelect(pos, SELECT_BY_POS)) {
     // Ваша обработка
  }
}
PrevOrdersTotal=pos;
Причина обращения: