Вопрос по мультивалютному советнику - страница 11

 
Vinin >>:

Создаем два массива. Один по номеру тикета, второй по цене. Потом сортируем массив по цене, одновременно перемещая номера тикетов (не нарушая связи). Тогда с одного конца массива будет самая маленькая цена, с другого самая большая цена. Осталось изменить один их крайних ордеров.

Благодарю.
Практически не работал ещё с массивами.
Пусть, например у меня 10 ордеров БАЙСТОП. Задаю цены их установки :

double price1 =GetOrderOpenPrice(NULL,OP_BUYSTOP, 1);//цена 1 байстоп
double price2 =GetOrderOpenPrice(NULL,OP_BUYSTOP, 2);//цена 2 байстоп
double price3 =GetOrderOpenPrice(NULL,OP_BUYSTOP, 3);//цена 3 байстоп
double price4 =GetOrderOpenPrice(NULL,OP_BUYSTOP, 4);//цена 4 байстоп
double price5 =GetOrderOpenPrice(NULL,OP_BUYSTOP, 5);//цена 5 байстоп
double price6 =GetOrderOpenPrice(NULL,OP_BUYSTOP, 6);//цена 6 байстоп
double price7 =GetOrderOpenPrice(NULL,OP_BUYSTOP, 7);//цена 7 байстоп
double price8 =GetOrderOpenPrice(NULL,OP_BUYSTOP, 8);//цена 8 байстоп
double price9 =GetOrderOpenPrice(NULL,OP_BUYSTOP, 9);//цена 9 байстоп
double price10=GetOrderOpenPrice(NULL,OP_BUYSTOP, 10);//цена 10 байстоп



Далее, я задаю массив цен установки, при этом ордер 1 - самый близкий к тек . цене

int  МассивЦен =  { price1,price2,price3,price4,price5,price6,price7,price8,price9,price10 }

А как создать массив по тикетам, мне не ясно. Где взять тикеты ордеров?

 

Что примерно подобное

// Функция возвращает номер тикета ордера с самой маленькой ценой или с самой большой
// По умолчанию сортировка по возрастанию
// Только вот что за цену брать, я возьму стоп (цену открытия мы менять не можем)
int MiniMaxOrderPrice(string lSymbol="", int lMagic=-1, int lOP=-1, int reversi=0){
   double   ArrayPrice[];
   int      ArrayTicket[];
   int      Total=OrdersTotal();
   int      tmpTicket;
   double   tmpPrice;
   bool     bSort=true;
   
   ArrayResize(ArrayPrice,Total);
   ArrayResize(ArrayTicket,Total);
   int i, count=0;
   for (i=0;i<Total;i++) {
      if (!OrderSelect(i, SELECT_BY_POS))             continue;
      if (!(OrderSymbol()==lSymbol || lSymbol==""))   continue;
      if (!(OrderMagicNumber()==lMagic || lMagic==-1))continue;
      if (!(OrderType()==lOP || lOP==-1))             continue;
      ArrayPrice[count]=OrderStopLoss();
      ArrayTicket[count]=OrderTicket();
      count++;
   }
   
   
   if (count>0) {
      ArrayResize(ArrayPrice,count);
      ArrayResize(ArrayTicket,count);
      while (bSort) {
         bSort=false;
         for (i=1;i<count;i++) {
            if (ArrayPrice[i-1]>ArrayPrice[i]) {
               tmpPrice=ArrayPrice[i-1];
               ArrayPrice[i-1]=ArrayPrice[i];
               ArrayPrice[i]=tmpPrice;
               tmpTicket=ArrayTicket[i-1];
               ArrayTicket[i-1]=ArrayTicket[i];
               ArrayTicket[i]=tmpTicket;
               bSort=true;
            }
         }
      }
      if (reversi==0) return(ArrayTicket[0]); else return(ArrayTicket[count-1]);
   }
   return(-1);
}

   
Код не проверял
 
Благодарю, Vinin ! Буду вникать.
 

Видимо функция работает так:

MiniMaxOrderPrice(string lSymbol="", int lMagic=-1, int lOP=-1, int reversi=0)

 Параметры:
lSymbol= - наименование инструмента ("" - любой символ,  NULL - текущий символ)

 lOP=-1- операция (-1 - любой ордер, в нашем конкретном случае -OP_BUYSTOP )
 lMagic=-1 - MagicNumber (-1 - любой магик)  

//---------------------------------------------------------------------------------------------

А вот что означает "int reversi=0", - мне не совсем понятно !

Скоппелировалась функция нормально.Может быть:

0 - самая малая цена

1 - самая большая ?


//-------------------------------------------------------------------

И ещё, -а почему именно стоплосс мы взяли за цену?

И почему мы не можем изменить цену открытия?

OP_BUYSTOP - Ведь это отложенные ордера (а вовсе не позиции),  и как раз конечный итог мероприятия и заключается, чтобы изменить именно цену открытия (срабатывания) конкретно выбранного ордера.

 
rid писал(а) >>

Видимо функция работает так:

MiniMaxOrderPrice(string lSymbol="", int lMagic=-1, int lOP=-1, int reversi=0)

Параметры:
lSymbol= - наименование инструмента ("" - любой символ, NULL - текущий символ)

lOP=-1- операция (-1 - любой ордер, в нашем конкретном случае -OP_BUYSTOP )
lMagic=-1 - MagicNumber (-1 - любой магик)

//---------------------------------------------------------------------------------------------

А вот что означает "int reversi=0", - мне не совсем понятно !

Скоппелировалась функция нормально.Может быть:

0 - самая малая цена

1 - самая большая ?


//-------------------------------------------------------------------

И ещё, -а почему именно стоплосс мы взяли за цену?

И почему мы не можем изменить цену открытия?

OP_BUYSTOP - Ведь это отложенные ордера (а вовсе не позиции), и как раз конечный итог мероприятия и заключается, чтобы изменить именно цену открытия (срабатывания) конкретно выбранного ордера.

Так возьми любую нужную цену. Для отложенников цену открытия. Я же только как пример сделал.

 

А по моему, проще задать двумерный массив и отсортировать по первому измерению. Туда, соответственно, загнать то что нужно. В вашем случае - цену.

double Price_Ticket[][2]
int total=OrdersTotal();
ArrayResize(Price_Ticket,total);
for (int i=0;i<total;i++) if (OrderSelect(i,SELECT_BY_POS))
{
 Price_Ticket[i][0]=OrderOpenPrice();
 Price_Ticket[i][1]=OrderTicket();
}
ArraySort(Price_Ticket);
 
Xupypr >>:

А по моему, проще задать двумерный массив и отсортировать по первому измерению. Туда, соответственно, загнать то что нужно. В вашем случае - цену.

   SetIndexBuffer(0, Test);
   SetIndexStyle(0, DRAW_HISTOGRAM);
//---- indicators
//----

   double Price_Ticket[][2];
   
   int size = 10;
   ArrayResize(Price_Ticket, size);
Это в ините. Индюк тупо виснет. Функция старт пустая, билд 220.
 
Vinin >>:

Так возьми любую нужную цену. Для отложенников цену открытия. Я же только как пример сделал.

ВОТ  у меня, предположим, выставлено 10 ордеров байстоп. Выставлены они не по порядку, а вразнобой по времени.

Мне нужно удалить ордер, который в текущий момент находится дальше всех остальных от текущей цены.

Вот так правильно будет найти этот ордер ? - 

//******************************

p.s.

Вставил функцию в коммент.

Comment( MiniMaxOrderPrice(NULL, -1, OP_BUYSTOP, 1 )); 

Но фукция постоянно возвращает "-1". Хотя ордеров на графике от 5 до 10 бывает.

где-то ошибка... 

// Функция возвращает номер тикета ордера с  с самой
// малой или , int reversi=0,большой ценой
// По умолчанию сортировка по возрастанию


int MiniMaxOrderPrice(string lSymbol="", int lMagic=-1, int lOP=-1, int reversi=0 ){
   double   ArrayPrice[];
   int      ArrayTicket[];
   int      Total=OrdersTotal();
   int      tmpTicket;
   double   tmpPrice;
   bool     bSort=true;
   
   ArrayResize(ArrayPrice,Total);
   ArrayResize(ArrayTicket,Total);
   int i, count=0;
   for (i=0;i<Total;i++) {
      if (!OrderSelect(i, SELECT_BY_TICKET, MODE_TRADES))     continue;
      if (!(OrderSymbol()==lSymbol || lSymbol==""))   continue;
      if (!(OrderMagicNumber()==lMagic || lMagic==-1))continue;
      if (!(OrderType()==lOP || lOP==-1))             continue;
      ArrayPrice[count]= OrderOpenPrice();
      ArrayTicket[count]=OrderTicket();
      count++;
   }
   
   
   if (count>0) {
      ArrayResize(ArrayPrice,count);
      ArrayResize(ArrayTicket,count);
      while (bSort) {
         bSort=false;
         for (i=1;i<count;i++) {
            if (ArrayPrice[i-1]>ArrayPrice[i]) {
               tmpPrice=ArrayPrice[i-1];
               ArrayPrice[i-1]=ArrayPrice[i];
               ArrayPrice[i]=tmpPrice;
               tmpTicket=ArrayTicket[i-1];
               ArrayTicket[i-1]=ArrayTicket[i];
               ArrayTicket[i]=tmpTicket;
               bSort=true;
            }
         }
      }
      if (reversi==0) return(ArrayTicket[0]); else return(ArrayTicket[count-1]);
   }
   return(-1); }
 
rid писал(а) >>

ВОТ у меня, предположим, выставлено 10 ордеров байстоп. Выставлены они не по порядку, а вразнобой по времени.

Мне нужно удалить ордер, который в текущий момент находится дальше всех остальных от текущей цены.

Вот так правильно будет найти этот ордер ? -

//******************************

p.s.

Вставил функцию в коммент.

Comment( MiniMaxOrderPrice(NULL, -1, OP_BUYSTOP, 1 ));

Но фукция постоянно возвращает "-1". Хотя ордеров на графике от 5 до 10 бывает.

где-то ошибка...

Comment( MiniMaxOrderPrice("", -1, OP_BUYSTOP, 1 )); // любой символ

Comment( MiniMaxOrderPrice(Symbol(), -1, OP_BUYSTOP, 1 )); // текущий символ

 

Ок! Благодарю, Vinin !

Вроде бы заработала функция! Сейчас буду разбираться дальше!

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