Pregunta sobre el asesor multidivisa - página 11

 
Vinin >> :

Crea dos matrices. Una por número de billete, la segunda por precio. A continuación, ordene la matriz por precio, moviendo los números de los billetes al mismo tiempo (sin romper la conexión). Entonces, en un extremo de la matriz estará el precio más bajo y en el otro el más alto. Ahora tenemos que cambiar una de las órdenes extremas.

>> Gracias.
Prácticamente aún no he trabajado con arrays.
Supongamos, por ejemplo, que tengo 10 órdenes de BUYSTOP. Yo establezco los precios de su instalación:

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



A continuación, establezco una matriz de precios de configuración, siendo la orden 1 el precio más cercano al precio actual.

int ArrayCents = { precio1,precio2,precio3,precio4,precio5,precio6,precio7,precio8,precio9,precio10 }

Y cómo crear un array por ticket no me queda claro. ¿Dónde puedo conseguir los billetes de pedido?

 

¿Qué es algo como esto?

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

   
No he comprobado el código.
 
Gracias, Vinin. Lo investigaré.
 

Al parecer, la función funciona así:

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

Parámetros:
lSymbol= - nombre del símbolo ("" - cualquier símbolo, NULL - el símbolo actual)

lOP=-1 - operación (-1 - cualquier orden, en nuestro caso -OP_BUYSTOP )
lMagic=-1 - MagicNumber (-1 - cualquier mago)

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

Pero qué significa "int reversi=0" - ¡no me queda muy claro!

La función se ha copiado normalmente:

0 - precio más bajo

1 - el más grande ?


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

Y también, -¿por qué exactamente tomamos el stoploss como precio?

¿Y por qué no podemos cambiar el precio de apertura?

OP_BUYSTOP - porque se trata de órdenes pendientes (y no de posiciones), y sólo el resultado final del evento es cambiar el precio de apertura (activación) de una orden específica.

 
rid писал(а) >>

Al parecer, la función funciona así:

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

Parámetros:
lSymbol= - nombre del instrumento (" - cualquier símbolo, NULL - símbolo actual)

lOP=-1-operación (-1 - cualquier orden, en nuestro caso -OP_BUYSTOP )
lMagic=-1 - MagicNumber (-1 - cualquier magik)

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

Pero qué significa "int reversi=0" - ¡no me queda muy claro!

La función se ha copiado normalmente:

0 - el precio más bajo

1 - el más grande ?


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

Y también, -¿por qué exactamente tomamos el stoploss como precio?

¿Y por qué no podemos cambiar el precio de apertura?

OP_BUYSTOP - son órdenes pendientes (y no posiciones) lo que significa que al final tenemos que cambiar el precio de apertura de la orden elegida.

Así que coge el precio que necesites. El precio abierto de las órdenes pendientes. Sólo lo hice como ejemplo.

 

Creo que es más fácil crear un array bidimensional y ordenar por la primera dimensión. Y ahí, como corresponde, puedes poner lo que necesitas. En su caso, el precio.

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

Creo que es más fácil crear un array bidimensional y ordenar por la primera dimensión. Y ahí, como corresponde, puedes poner lo que necesitas. En su caso es el precio.

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

   double Price_Ticket[][2];
   
   int size = 10;
   ArrayResize( Price_Ticket, size);
Está en el inite. El pavo está colgado. La función de inicio está vacía, construye 220.
 
Vinin >> :

Así que coge el precio que quieras. En el caso de los colgantes, toma el precio de apertura. Sólo lo hice como ejemplo.

Supongamos que tengo 10 órdenes de bystop establecidas. No están ordenados, pero están separados por el tiempo.

Necesito eliminar la orden que está más alejada del precio actual.

¿Es esta la forma correcta de encontrar este orden? -

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

p.d.

He insertado una función en el comentario.

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

Pero sigue devolviendo "-1". Aunque hay de 5 a 10 órdenes en el gráfico.

hay un error en alguna parte...

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

Tengo, digamos, 10 pedidos de bystop realizados. No están colocados en orden, sino que están separados por el tiempo.

Necesito eliminar la orden que está más alejada del precio actual.

¿Es esta la forma correcta de encontrar este orden? -

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

p.d.

He puesto la función en el comentario.

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

Pero la función devuelve constantemente "-1". Aunque hay de 5 a 10 órdenes en el gráfico.

Hay un error en alguna parte...

Comment( MiniMaxOrderPrice("", -1, OP_BUYSTOP, 1 )); // cualquier símbolo

Comment( MiniMaxOrderPrice(Symbol(), -1, OP_BUYSTOP, 1 )); // símbolo actual

 

¡BIEN! Gracias, Vinin.

La función parece funcionar. Lo investigaré más a fondo.

Razón de la queja: