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

 
MisterD:
Hola de nuevo, ¿podríais decirme dónde hay un error en el siguiente código?
Llamo al bucle en el momento de "deinit".
Borra todo menos la última orden.
Creo que esta línea es probablemente un error >> for (int i=1; i<=OrdersTotal(); i++) <<
Sin embargo, lógicamente todo parece correcto... ¿ qué me he perdido ?

Gracias de antemano.


Hacer el bucle al revés

//-------------------------------------------------------------------------------------------
for (int i=OrdersTotal()-1; i>=0; i--)
{
   if (OrderSelect(i,SELECT_BY_POS)==true)
   {
      int Type=OrderType();
      if (OrderSymbol()!= Symbol() || Type <2)continue;
      int Ticket=OrderTicket();
      bool Modify =OrderDelete(Ticket);
      if (Modify == true) Alert ("Ордер Удалён");continue;
      if (Modify != true) Alert ("Удаление ордера не удалась");
   }
} 
//-------------------------------------------------------------------------------------------
 
MisterD:
Hola de nuevo, ¿podríais decirme dónde hay un error en el siguiente código?
Llamo al bucle en el momento de "deinit".
Borra todo menos la última orden.
Creo que esta línea es probablemente un error >> for (int i=1; i<=OrdersTotal(); i++) <<
Sin embargo, lógicamente todo parece correcto... ¿ qué me he perdido ?

Gracias de antemano.

//-------------------------------------------------------------------------------------------
for (int i=1; i<=TotalPedidos(); i++)
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
int Tipo=Tipo de orden();
si (OrderSymbol()!= Symbol() || Type <2)continuar;
int Ticket=OrderTicket();
Modificar=OrderDelete(Ticket);
if (Modify == true) Alert ("Orden eliminada"); continue;
if (Modify != true) Alert ("Order deleted failed");
continuar;
}
}
//-------------------------------------------------------------------------------------------


Pruébalo así:

for(int i=OrdersTotal()-1;i>=0;i--) {
  if(OrderSelect(i,......................
 

Buenas tardes. se necesita un poco de ayuda. hay una función que cierra uno de los lotes más gordos en cuanto a beneficios.

Tengo que hacer un bucle.

Por favor, aconsejar cómo utilizar esta función, por ejemplo, si la equidad de mi cuenta es más de 5 pips entonces esta función debe trabajar.

void ClosePosWithMaxProfitInCurrency(string sy="", int op=-1, int mn=-1) {
  double pr=0;
  int    i, k=OrdersTotal(), np=-1;

  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 (mn<0 || OrderMagicNumber()==mn) {
          if (pr<OrderProfit()+OrderSwap()) {
            pr=OrderProfit()+OrderSwap();
            np=i;
          }
        }
      }
    }
  }
  if (np>=0) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();
    }
  } 

}

 
sannin:

Buenas tardes. se necesita un poco de ayuda. hay una función que cierra uno de los lotes más gordos en términos de beneficio.

Tengo que hacer un bucle.

Por ejemplo, si la equidad de mi cuenta es superior a 5 pips, esta función debería funcionar.

Por ejemplo, si la equidad de la cuenta es superior a 5 pips (para 4 caracteres) - en el mercado real, si el número de órdenes es superior a 3-4, se convertirán fácilmente en menos (de acuerdo con los resultados de la eliminación). :)))

P.D. Tal y como yo lo veo, necesitas un código ya hecho, mientras que el algoritmo para resolver tal problema no te sirve.

 
TarasBY:
5 pips (para 4 signos) - en el mercado real si el número de órdenes mayor que 3-4, es fácil de convertir (por los resultados de la eliminación) en menos. :)))


Yo por mi parte... y he estado prestando atención al oro últimamente... no es tan rápido de reacción como pensaba

Todavía no he trabajado con funciones de este tipo... por eso pido apoyo

 
Buenas tardes, tengo un problema con el desarrollo del Asesor Experto, no cierra las órdenes, a pesar de que las condiciones prescritas para el cierre por un indicador, por favor expliquen que es, gracias de antemano
Archivos adjuntos:
 
sannin:


Bueno, yo por mi parte... y he estado prestando atención al oro últimamente... no es tan rápido como pensaba

Todavía no he trabajado con las funciones de este formulario ... así que aquí está una solicitud de apoyo

En primer lugar, se calcula la línea BU de una posición agregada para el instrumento (se utiliza para determinar las condiciones de cierre de las órdenes cuando alcanzan la rentabilidad en pips):

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Определение Уровня БезУбытка по символу                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_BreakEven (string fs_Symbol,     // Symbol
                       double fd_DeltaLots,  // разность объемов ордеров Buy и Sell
                       double fd_Profit)     // текущий профит по открытым ордера
{
    if (fd_DeltaLots == 0.) return (0.);
    double ld_BU = 0., ld_tickvalue = MarketInfo (fs_Symbol, MODE_TICKVALUE);   // цена одного пункта
//----
    //---- Уровень общего безубытка для открытых ордеров
    if (fd_DeltaLots > 0.) ld_BU = MarketInfo (fs_Symbol, MODE_BID) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
    else if (fd_DeltaLots < 0.) ld_BU = MarketInfo (fs_Symbol, MODE_ASK) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
//----
    return (ld_BU);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

A continuación, se calcula la diferencia entre el precio actual y la línea de equilibrio. Si la "diferencia" es satisfactoria, se procede al procedimiento de eliminación de órdenes. Lo primero que hay que hacer es encontrar el Ticket de la orden más rentable/perdedor:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Получаем Тикет самого прибыльного/убыточного ордера                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_TicketWithControlProfit (string fs_Symbol = "",  // Инструмент
                                  int fi_Magic = -1,      // Magic
                                  int fi_Type = -1,       // OrderType
                                  int fi_TypeProfit = 0)  // Профитность ордера среди остальных ордеров:
                                                          // >= 0 -  с самым большим профитом;
                                                          // < 0 - самый убыточный
{
    double ld_Profit = 0., ld_curProfit;
    int    li_Total = OrdersTotal(), li_Ticket = -1;
//----
    if (fs_Symbol == "") fs_Symbol = Symbol();
    if (fi_TypeProfit < 0) ld_Profit = 10000000000.;
    for (int i = li_Total - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != fs_Symbol) continue;
        if (fi_Magic > -1) if (OrderMagicNumber() != fi_Magic) continue;
        if (fi_Type > -1) if (OrderType() != fi_Type) continue;
        if (fi_Type > 1) continue;
        ld_curProfit = OrderProfit() + OrderSwap() + OrderCommission();
        if (fi_TypeProfit >= 0) {if (ld_Profit <= ld_curProfit) continue;}
        else if (ld_Profit >= ld_curProfit) continue;
        ld_Profit = ld_curProfit;
        li_Ticket = OrderTicket();
    }
//----
    return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

El borrado puede hacerse en cualquier dirección. Borremos:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Функция закрытия "своих" ордеров по признаку                               |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fClose_AllOrdersByProfit (string fs_Symbol = "",  // Инструмент
                              int fi_Magic = -1,      // Magic
                              int fi_Type = -1,       // OrderType
                              int fi_TypeProfit = 0)  // Направление закрытия ордеро по профитности:
                                                      // >= 0 - начиная от самого большого профита;
                                                      // < 0 - начиная от самого маленького профита;
{
    int li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit),
        li_cnt = 0;
//----
    while (li_Ticket > 0)
    {
         //---- Здесь вставите свою процедуру закрытия 
         //---- что-то типа:
         //ClosePosByTicket (li_Ticket);
         li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit);
         li_cnt++;
    }
//----
    return (li_cnt);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

No es demasiado difícil montar la unidad correcta más adelante: tendrás que hacerlo o ir al trabajo... :)

 
Quiero asignar un valor de precio a una variable.

a=(NormalizeDouble(OrderOpenPrice(),5));


Pero por alguna razón, el precio se dibuja con un valor de cuatro dígitos a 1,3360

¿Podría decirme cuál es el error?
 
lottamer:
Quiero asignar un valor de precio a una variable.



Pero por alguna razón, el precio se dibuja con un valor de cuatro dígitos a 1,3360

¿Puede decirme cuál es el error?

¿Tal vez el DC es de cuatro dígitos? O bien, la salida del precio sin DoubleToStr(YourPrice,5)
 
Sepulca:

¿Tal vez el DC es de cuatro dígitos? O mostrar el precio sin DoubleToStr(YourPrice,5)


El DC es de cinco dígitos...

¿Qué significa SIN DoubleToStr(SuPrecio,5)? No tengo DoubleToStr(SuPrecio,5) en ninguna parte