Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 711

 
LBatters:

Hola a todos)

He intentado escribir una función para cerrar una parte de la posición, pero cuando la ejecuto en el probador, el 138 da error, no entiendo cual es el problema, ayuda por favor.

Aquí hay un EA en el que esta función debería funcionar)

138 - "El precio solicitado no está actualizado o la oferta y la demanda están mezcladas".

El precio de apertura/cierre no se puede recalcular, porque está ahí, y aquí está el problema (hayque solicitar el precio y darle un valor mediante MarketInfo, y renombrar éste a otra variable):

                 PriceCl    = NormalizeDouble((takeprofit + OrderOpenPrice())/t,Digits);  //примерную цену закрытия
                 order = OrderTicket();    //получили ордер
                 if(Bid>PriceCl) //если текущая цена оказалась выше нашей цены ,то закрываем часть ордера
                 {OrderClose(order,NormalizeDouble(lot*percent/100,2),PriceCl,3);}
 
7Konstantin7:

Hola a todos.

Estoy tratando de actualizar un simple EA de arrastre por Kim para eliminar las órdenes pendientes después de cerrar todas las órdenes de mercado, falla(

He añadido la función de eliminar los pedidos pendientes:

He encontrado otro problema que no puedo resolver porque no soy demasiado bueno en la codificación.

Supongo que debería escribir una condición como:

Esto es sólo un ejemplo de otro EA.


Por favor, ayúdenme.

Kostya, inicia un bucle calculando el número de pedidos de los tipos requeridos y luego elimínalo como quieras.
 
_new-rena:
Kostya, haz un bucle para calcular el número de pedidos para los tipos requeridos, luego borra como quieras, no te hagas el listo.

Soy un nerd del código) He añadido más pausas allí, tal vez ayude)

  if (OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
 
7Konstantin7:

Soyun empollón del código ). Le he añadido más pausas, quizás ayude).

El resaltado no es el problema. El problema es que antes de añadir las pausas deberías haber pensado: "¿Qué te aporta?". No hará nada... y ¿tiene algún sentido añadirlo?

No entendí el resto, estoy borracho y no respeto los códigos de Kim... lo siento...

 
AlexeyVik:

El resaltado no es el problema. El problema es que antes de añadir las órdenes pendientes deberías haber pensado "¿Qué te aporta?" No hace nada... y ¿tiene algún sentido añadirlo?

Y el resto no lo he entendido, estoy borracho y los códigos de Kim no los respeto... lo siento...

Nada) Lo pensé, tengo que escribir una condición y ahora estoy pensando.

Sí, los códigos no son de verdad en él) al menos de forma gratuita, sobre los de pago no sé.

 
7Konstantin7:

No hizo nada) pensé entonces, tengo que escribir una condición, estoy pensando.

No sé cómo hacerlo, pero tengo un código diferente para los reales.

En el caso de los reales, cada casa de valores tiene su propio código, por lo que no hay uno universal.

 

Problema resuelto) pensó largo y tendido) gracias a todos.

   if (gdProfit>BEGIN_PROFIT) {
    ClosePosFirstProfit();
    if (DeleteOrders) DeleteOrders();
  }
 

Hola a todos.

Me encuentro con un problema de cierre de órdenes de contador en un marcador de cinco. La cuestión es que necesito cerrar, digamos, 20 órdenes de compra y 33 de venta cuando se alcance el beneficio total. Y quiero cerrar 20 órdenes de compra y 20 órdenes de venta utilizando la función OrderCloseBy(), y cerrar las 13 órdenes de venta restantes utilizando la función OrderClose().

Si tenemos un spread fijo a 4 dígitos, no tendremos problemas con el cierre del spread y además guardamos el spread al utilizar la función OrderCloseBy(). Si tenemos un spread de 5 dígitos, el spread es flotante y por eso creo que las órdenes no se cierran cuando se alcanza el beneficio total y el registro dice OrderCloseBy(). Al mismo tiempo, si lo ejecutamos en el probador, todo se cierra normalmente.

Las órdenes en una dirección, cuando se alcanza el beneficio total, se cierran sin problemas.

¿Quién se ha encontrado con un problema así y qué opciones hay para resolverlo?

Esta es la función para cerrar órdenes.

  //-----------------------------------------------------------------------
  // функция подсчета открытых ордеров
  //-----------------------------------------------------------------------

  void OrderOpen()
   {
     Orders_BUY=0; Orders_SELL=0;
     for(int a=0; a<=OrdersTotal(); a++)
     {
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_BUY && OrderMagicNumber() == Magic) Orders_BUY=Orders_BUY+1;
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_SELL && OrderMagicNumber() == Magic) Orders_SELL=Orders_SELL+1;

      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) Orders_BUY=Orders_BUY+1;
      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) Orders_SELL=Orders_SELL+1;
      ProfitAll=ProfitAll+OrderProfit()+OrderSwap()+OrderCommission();
     }
   }
  
  //-----------------------------------------------------------------------
  // функция закрытия ордеров сначала разнонаправленных
  //-----------------------------------------------------------------------
  void ClosePos()
   {
   int ticket_1=0, ticket_2=0;
    
     for (int a=0; a<=OrdersTotal(); a++)
       {
         if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true) 
            {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) // проверка по символу и магику
               {
                if(OrderType() == OP_BUY) ticket_1 = OrderTicket();
                if(OrderType() == OP_SELL) ticket_2= OrderTicket();   
               } 
            }
        }    
      if(ticket_1 != 0 && ticket_2 != 0) {          // если найдены разнонаправленные ордера
      res = OrderCloseBy(ticket_1,ticket_2,clrRed); }   // закроем их
       
      if(ticket_1 == 0 && ticket_2 != 0) {  CloseOrder_by_type(OP_SELL,Symbol());  }
      if(ticket_1 != 0 && ticket_2 == 0) {  CloseOrder_by_type(OP_BUY,Symbol());  }
    
    }

//---- Закрытие ордера по типу и комментарию ----//
void CloseOrder_by_type(int type, string sym)
{
   for(int k= OrdersTotal()-1;k>=0;k--)
   {
    
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
       {
           
      if(type == OrderType() && sym==OrderSymbol()&& OrderMagicNumber()==Magic)
         if(OrderType()<=1){ res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),350);}
         else { res = OrderDelete(OrderTicket());}
         if(!res)
               Print("Ошибка закрытия ордера. Код ошибки=",GetLastError());
            else
               Print("ордер успешно закрыт.");   
           
       }
   }
}  
 

Por favor, indique cómo cerrar las órdenes en el orden en que fueron abiertas.

Quiero rehacer esta función:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене сначала прибыльных           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();

  // Сначала закрываем прибыльные позиции
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Потом все остальные
  k=OrdersTotal();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 
7Konstantin7:

Por favor, indique cómo cerrar las órdenes en el orden en que fueron abiertas.

Quiero rehacer esta función:

La respuesta es obvia. Ordenar las posiciones abiertas por la hora de su apertura. Y luego cerrarlos en la lista de la matriz ordenada.