[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 276

 
BBSL:

Si hablamos de ticks, puedes escribir un código que guarde el archivo de datos, pero tendrás que cargarlo desde un archivo en ekspert. ¿Tendría sentido mantener el ordenador en funcionamiento?
Supongo que debería utilizar la segunda opción. Gracias, BBSL.
 
artmedia70:

Lo que estás haciendo es extraño... Al abrir una posición se asigna el número de billete a una variable, pero se comprueba otra...

Y OrderSend() devuelve -1 (menos uno) en caso de fallo, y se comprueba si hay menos de uno, cuando se necesita menos de cero

Esto es lo primero que llama la atención. Pero creo que tienes muchas cosas interesantes ahí... :)


Ooh-ha-ha, sí hay mucha diversión... Sobre todo cuando se empieza a comprobar))

Vamos, una vez más... Es así,

Abro el orden:

order_id = OrderSend(Symbol(),OP_SELL,1.0,Bid,3,0,0,"expert comment",255,0,Red);
   if(order_id<0)
     {
      error=GetLastError();
      Print("send_orders, error = ",ErrorDescription(error));
      return;
     }
     } 

Orden de cierre:

if(OrderSelect(0, SELECT_BY_POS)==true){

OrderClose(OrderTicket(),1,Bid,3,Red);

}

Bien, dado un único pedido).

 
hedger:
Aparentemente se debe utilizar la segunda opción. Gracias, BBSL.

De nada, espero que te ayude de verdad))
 
artmedia70:

Lo que estás haciendo es extraño... Al abrir una posición se asigna el número de billete a una variable, pero se comprueba otra...

Y OrderSend() devuelve -1 (menos uno) en caso de fallo, y se comprueba si hay menos de uno, cuando se necesita menos de cero

Esto es lo primero que llama la atención. Pero creo que tienes muchas cosas interesantes ahí... :)


Lo entiendo, el número de tikit debería obtenerse así:

nomer_ticketa = OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0,"expert comment",255,0,Green);
   if(ticket<1)
 
artmedia70:

Lo que estás haciendo es extraño... Al abrir una posición se asigna el número de billete a una variable, pero se comprueba otra...

Y OrderSend() devuelve -1 (menos uno) en caso de fallo, y se comprueba si hay menos de uno, cuando se necesita menos de cero

Esto es lo primero que llama la atención. Pero creo que tienes muchas cosas interesantes ahí... :)


Respeto, gracias))
 
BBSL:


Entiendo que hay que conseguir el número de tickit así:

Puede que con un solo pedido funcione, pero si aún así lo abres manualmente, no será lo mismo. El número de ticket debe guardarse en una variable, y después de la selección del pedido debemos comparar su ticket con el almacenado:

 if (OrderTicket()==number_ticket) {
   // ... код для работы с выбранным ордером при совпадении тикетов
   }

Y en general, la selección de la orden debe hacerse mediante la función OrderSelect() en el bucle:

for (i=0; i<OrdersTotal(); i++) {                    // цикл по всем рыночным ордерам терминала
   if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { // Если выбран любой рыночный ордер с индексом i
      if (OrderSymbol()!=Symbol())     continue;   // Если символ не текущего графика, переходим к выбору следующего ордера
      if (OrderMagicNumber()!=Magic)   continue;   // Если его магик не совпадает с магиком советника - переходим к выбору следующего
//... далее можно проверять другие параметры выбранного ордера, но в этом месте уже есть выбранный ордер текущего графика и номером магика советника
      if (OrderTicket()==number_ticket) {          // проверяем тикет выбранного ордера и, если есть совпадение, выполняем с ним дальнейшие действия
         // ... код, выполняющий дальнейшие действия с найденным нужным ордером ...
         }
      }
   else if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // Иначе, если не удалось выбрать ордер
      Print ("Ошибка при выборе ордера из списка рыночных ордеров = ", GetLastError());  // Выведем сообщение об ошибке и её номер в журнал.
   }

Esto es sólo un ejemplo para entender, no un código de trabajo completo, si acaso... :)

 
artmedia70:

Si sólo tienes un pedido, puede funcionar, pero si abres más manualmente, no será lo mismo. El número de ticket debe guardarse en una variable, y después de seleccionar un pedido, debemos comparar su ticket con el almacenado:

Y, en general, la selección de órdenes debe hacerse mediante la función OrderSelect() en el bucle:

Esto es sólo un ejemplo para entender, no un código de trabajo completo, si acaso... :)




Al cerrar las órdenes, si hay más de una orden, debemos utilizar este bucle:

int i, k=OrdersTotal();

  for (i=k-1; i>=0; i--) {
 //...
 
bolt:

Al cerrar las órdenes, si hay más de una, se debe utilizar un ciclo como éste:

Lee la última línea de mi post. ¿Quién ha dicho que he escrito un ejemplo para cerrar?

El resto es la pura verdad. Escriba su propio libro de texto.

 

¿Pueden decirme por qué no funciona OrderOpenPrice? La tarea consiste en buscar en el pool una orden colocada a un determinado precio, y si no está ahí, colocar la orden y poner una bandera de que está colocada.


for(int i=1 ; i <= OrdersTotal() ; i++)
   {
   if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES))
      {
      if(OrderOpenPrice() == price) 
        {
        orderset = true;
        }
      }
   }
     
if((orderset==false)
   {
   OrderSend(Symbol(),OP_SELLLIMIT,baselot,price,3,NULL,price-10,"Comment",0001+i,0,White); 
   }
 
Pyro:

¿Pueden decirme por qué no funciona OrderOpenPrice? La tarea consiste en buscar en el pool una orden colocada a un determinado precio, y si no está ahí, colocar la orden y poner una bandera de que está colocada.



No podemos comparar números reales.