Pergunta do assessor multimoedas - página 11

 
Vinin >> :

Criar duas matrizes. Uma pelo número do bilhete, a segunda pelo preço. Em seguida, ordenar a matriz pelo preço, movendo os números dos bilhetes ao mesmo tempo (sem quebrar a conexão). Então, em uma extremidade da matriz estará o preço mais baixo, na outra o preço mais alto. Agora temos que mudar uma das ordens extremas.

>> Obrigado.
Eu ainda não trabalhei praticamente com arrays.
Suponha, por exemplo, que eu tenha 10 ordens BUYSTOP. Eu estabeleço seus preços de instalação:

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 байстоп



Então, eu estabeleço um conjunto de preços de configuração, sendo o pedido 1 o preço mais próximo do preço atual.

int ArrayCents = { preço1,preço2,preço3,preço4,preço5,preço6,preço7,preço8,preço9,preço10 }

E como criar uma matriz por bilhete não é claro para mim. Onde posso obter as passagens de pedido?

 

O que é algo assim?

// Функция возвращает номер тикета ордера с самой маленькой ценой или с самой большой
// По умолчанию сортировка по возрастанию
// Только вот что за цену брать, я возьму стоп (цену открытия мы менять не можем)
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);
}

   
Não checou o código.
 
Obrigado, Vinin! Vou investigar isso.
 

Aparentemente, o funcionamento funciona assim:

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

Parâmetros:
lSymbol= - nome do símbolo ("" - qualquer símbolo, NULL - o símbolo atual)

lOP=-1 - operação (-1 - qualquer ordem, em nosso caso -OP_BUYSTOP )
lMagic=-1 - MagicNumber (-1 - qualquer mágico)

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

Mas o que significa "int reversi=0" - não é bem claro para mim!

A função foi copiada normalmente:

0 - preço mais baixo

1 - o maior ?


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

E também, - por que exatamente tomamos o stoploss como um preço?

E por que não podemos alterar o preço de abertura?

OP_BUYSTOP - porque estas são ordens pendentes (e não posições), e apenas o resultado final do evento é alterar o preço de abertura (acionamento) de uma ordem específica.

 
rid писал(а) >>

Aparentemente, o funcionamento funciona assim:

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

Parâmetros:
lSymbol= - nome do instrumento ("" - qualquer símbolo, NULL - símbolo atual)

lOP=-1-operação (-1 - qualquer ordem, em nosso caso -OP_BUYSTOP )
lMagic=-1 - MagicNumber (-1 - qualquer magik)

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

Mas o que significa "int reversi=0" - não é bem claro para mim!

A função foi copiada normalmente:

0 - o menor preço

1 - o maior ?


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

E também, - por que exatamente tomamos o stoploss como um preço?

E por que não podemos alterar o preço de abertura?

OP_BUYSTOP - são ordens pendentes (e não posições), o que significa que no final temos que alterar o preço de abertura da ordem escolhida.

Portanto, aceite o preço que precisar. O preço aberto para as ordens pendentes. Eu o fiz apenas como um exemplo.

 

Acho que é mais fácil montar uma matriz bidimensional e ordenar pela primeira dimensão. E aí, portanto, você pode armazenar o que precisa. No seu caso, o preço.

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 >> :

Acho que é mais fácil montar uma matriz bidimensional e ordenar pela primeira dimensão. E aí, portanto, você pode armazenar o que precisa. No seu caso, é o preço.

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

   double Price_Ticket[][2];
   
   int size = 10;
   ArrayResize( Price_Ticket, size);
Está no inite. O peru está apenas pendurado. A função de partida está vazia, construir 220.
 
Vinin >> :

Portanto, aceite o preço que quiser. Para os pingentes, tome o preço de abertura. Estou apenas fazendo um exemplo.

Suponha que eu tenha 10 ordens bystop definidas. Elas não são colocadas em ordem, mas são separadas pelo tempo.

Preciso apagar o pedido que está atualmente mais distante do preço atual.

Esta é a maneira correta de encontrar esta ordem? -

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

p.s.

Eu inseri uma função no comentário.

Comentário( MiniMaxOrderPrice(NULL, -1, OP_BUYSTOP, 1 );

Mas ele continua retornando "-1". Embora haja de 5 a 10 pedidos na tabela.

há um erro em algum lugar...

// Функция возвращает номер тикета ордера с  с самой
// малой или , 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 писал(а) >>

Eu tenho, digamos, 10 pedidos de compra de bystop feitos. Eles não são colocados em ordem, mas são separados pelo tempo.

Preciso apagar o pedido que está atualmente mais distante do preço atual.

Esta é a maneira correta de encontrar esta ordem? -

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

p.s.

Coloco a função no comentário.

Comentário( MiniMaxOrderPrice(NULL, -1, OP_BUYSTOP, 1 ));

Mas a função retorna constantemente "-1". Embora haja de 5 a 10 pedidos na tabela.

Há um erro em algum lugar...

Comentário( MiniMaxOrderPrice("", -1, OP_BUYSTOP, 1 )); // qualquer símbolo

Comentário( MiniMaxOrderPrice(Symbol(), -1, OP_BUYSTOP, 1 )); // símbolo atual

 

OK! Obrigado Vinin !

A função parece estar funcionando! Vou investigar mais a fundo!