[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 825

 
eugggy:
Lo entiendo en términos generales, pero ¿qué significa if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))break; si no se selecciona esa orden, entonces aborta o qué?


OrderSelect (véase https://docs.mql4.com/ru/trading/OrderSelect) devuelve FALSE cuando la función falla. Consulte https://docs.mql4.com/ru/basis/operators/break para conocer el operador de la pausa.

Esto se puede simplificar a

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

lo principal es seleccionar el orden.

 
eugggy:


Y a mí me parecen cosas absolutamente diferentes. Podría insertar esto en su código if(Tip==OP_BUYSTOP||Tip==OP_SELLSTOP&&Minute()<59&&Minute()>57) OrderDelete(Ticket);

y si es así, ¿qué parte?


Sin ver tu código, puedo suponer que en cambio (todo depende de tu algoritmo):

if(OrderType()==OP_BUYSTOP) OrderDelete(OrderTicket());
if(OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());
if(OrderType()==OP_BUYLIMIT) OrderDelete(OrderTicket());
if(OrderType()==OP_SELLLIMIT) OrderDelete(OrderTicket());

Sólo hay que poner orden en las variables y corregir los paréntesis en la condición con || y &&.

La condición Minute()<59&&Minute()>57 puede reducirse a Minute()==58 o utilizar >= o <=.

Para forzar el cierre de una orden pendiente al final de un período o a una hora determinada al establecerla, puede especificar el parámetro de fecha de vencimiento - véase https://docs.mql4.com/ru/trading/OrderSend. En este caso no hay que molestarse en programar su cierre. Y la orden se cerrará incondicionalmente sin ninguna corrección por la falta de conexión.

 
eugggy:

Sí, muchas cosas útiles. Podría haber prescindido de los regalitos, pero es un libro de texto muy intrincado.
Verás... Estoy en el tema de cómo "están hablando ahora" :)

¡Gratis, amigos! ¡Yo! ¡¡¡Comon evry body!!!

Supongo que si el libro de texto de SC estuviera escrito así sería un 6+.

Perdón por el off-topic...

 
eugggy:

No, no lo necesitamos en su lugar, lo necesitamos además. He mirado el gráfico: a veces el precio no sale del canal Alto-Bajo y las órdenes pendientes permanecen. Si no salen del canal Alto-Bajo, se mantienen, lo único que hay que hacer es cerrar los pendientes antes de que aparezcan los nuevos. En cuanto al libro de 1986, ¿hablas en serio? Yo también soy antiguo, pero creo que es demasiado.


Además, tiene que escribir un código adicional similar. De alguna manera me parece que tu código es un poco desordenado.

No estaba bromeando sobre el libro de 1986. De nuevo, si quieres aprender los fundamentos de la programación, tienes que aprenderlos sin atascar tu cabeza con construcciones de lenguajes modernos. Necesitas lo básico. Los libros de texto de informática para los institutos, especialmente el primero, están metódicamente bien compuestos para gente "tonta". Cómo, quién, para quién y por qué se escriben los libros de texto modernos es un tema aparte

 

fecha hora lotes precio

26 2010.01.05 12:24 vender 12 0.10 1.44026 1.44907 1.43526 0.00 3200.09
28 2010.01.05 13:21 comprar 13 0.26 1.44326 1.43445 1.44826 0.00 3200.09
30 2010.01.05 15:34 vender 14 0.43 1.44026 1.44907 1.43526 0.00 3200.09
32 2010.01.05 16:27 comprar 15 0.72 1.44326 1.43445 1.44826 0.00 3200.09
34 2010.01.05 17:18 vender 16 1.19 1.44026 1.44907 1.43526 0.00 3200.09

Aquí tenemos 5 órdenes abiertas en las direcciones correspondientes.

¿Cómo calcular el margen total de todas las órdenes abiertas?

Par: EURODÓLAR, contrato 100.000, apalancamiento 100.

 
ikatsko:

fecha hora lotes precio

26 2010.01.05 12:24 sell 12 0.10 1.44026 1.44907 1.43526 0.00 3200.09
28 2010.01.05 13:21 buy 13 0,26 1,44326 1,43445 1,44826 0,00 3200,09
30 2010.01.05 15:34 vender 14 0,43 1,44026 1,44907 1,43526 0,00 3200,09
32 2010.01.05 16:27 buy 15 0,72 1,44326 1,43445 1,44826 0,00 3200.09
34 2010.01.05 17:18 sell 16 1.19 1.44026 1.44907 1.43526 0.00 3200.09

Aquí hay 5 órdenes abiertas en las respectivas direcciones.

¿Cómo puedo calcular el margen total de todas las órdenes abiertas?

Par: EUROLLAR, contrato 100000, apalancamiento 100.

MarketInfo(Symbol(),MODE_MARGINREQUIRED);

Devuelve la cantidad de fondos libres necesarios para abrir 1 lote en una orden de compra, bueno mira los otros, dependiendo de tus necesidades.

Esto también puede resultarle útil:

double AccountFreeMarginCheck ( string symbol, int cmd, double volume)

Devuelve la cantidad de fondos libres que quedan después de abrir la posición especificada al precio actual en la cuenta actual. Si no hay suficientes fondos disponibles, se generará el error 134 (ERR_NOT_ENOUGH_MONEY).
 
Gracias por la rápida respuesta, pero quiero calcular el margen ANTES de que se abran estas posiciones. La estrategia es una avalancha, necesito saber si habrá un Stop Out después de abrir las posiciones correspondientes? El tamaño de todos los lotes futuros se conoce de antemano. Me gustaría saber: ¿cuántas órdenes (con lotes incrementales conocidos de antemano) se pueden abrir?
 
ikatsko:
Gracias por la rápida respuesta, pero quiero calcular el margen ANTES de que se abran estas posiciones. La estrategia es una avalancha, necesito saber si habrá un Stop Out después de abrir las posiciones correspondientes? El tamaño de todos los lotes futuros se conoce de antemano. Me gustaría saber: ¿cuántas órdenes (con lotes incrementales conocidos de antemano) se podrán abrir?
// ==========================================================================
// ------------ Функция рассчёта величины лота для открытия позиции ---------
// Если лот превышает возможный для открытия позы, то он корректируется 
// ==========================================================================

double CorrectLots(double lt)
{
   double ltcorr;
   double pnt =      MarketInfo(Symbol(),MODE_POINT);
   double mspr =     MarketInfo(Symbol(),MODE_SPREAD);
   double dig =      MarketInfo(Symbol(),MODE_DIGITS);
   double MaxLot =   MarketInfo(Symbol(),MODE_MAXLOT);
   double MinLot =   MarketInfo(Symbol(),MODE_MINLOT);
   double StpLot =   MarketInfo(Symbol(),MODE_LOTSTEP);
   double OneLot =   MarketInfo(Symbol(),MODE_MARGINREQUIRED);
   double TradeMrg = NormalizeDouble(AccountFreeMargin()/4.0,dig);    // Свободные средства, разрешенные к торговле
   
   lt=MathAbs(lt);
   ltcorr=lt;                       // Зададим начальное значением ltcorr равным значению lt
   
   if (lt>MaxLot) ltcorr=MaxLot;   // Проверим превышение допустимых ...
   if (lt<MinLot) ltcorr=MinLot;   // ... значений лота
   
   double Money=ltcorr*OneLot+mspr*pnt;    // Вычисляем стоимость открываемой позы

   if (Money<TradeMrg)              // Если свободных средств больше, чем цена позиции - 
      {
         return(ltcorr);                                                            // ... возвращаем неизменённый лот
      }
   else if (Money>=TradeMrg)        // Если цена позиции равна или больше, чем есть свободных средств, то ...
      {
         ltcorr=MathAbs(MathFloor(TradeMrg/OneLot/StpLot)*StpLot);               // ... рассчитаем допустимый лот
         double MoneyCorr=ltcorr*OneLot+mspr*pnt;                      
         Print("Func CorrectLots: лот ",lt," скорректирован до ",ltcorr,
               " Стоимость позы до корректировки = ",Money,
               " Стоимость позы после корректировки = ",MoneyCorr
               ); 
         return(ltcorr);                                                         // ... и вернём его значение
      }
   Print("Func CorrectLots: лот вернули без изменений");
   if (lt>MaxLot) ltcorr=MaxLot;   // Проверим превышение допустимых ...
   if (lt<MinLot) ltcorr=MinLot;   // ... значений лота
   return(ltcorr);                            // Возврат изначального лота в непредусмотренных случаях с сообщением
}

Intenta ver lo que puedes averiguar por ti mismo... :)

Y, de nuevo.

double AccountFreeMarginCheck ( string symbol, int cmd, double volume)

He utilizado esta función en un EA personalizado que también utiliza una martingala desnuda.
Tuve que escribir una línea antes de abrir cualquier posición para que fuera más estable:

double lt;                           // Лот
// --------------------------------- +

lt=CorrectLots(lt*2);                // Умножаем лот на 2 с проверкой и коррекцией под допустимый размер лота

// ------- Открытие позы ----------- +
 
Artem, necesito calcular el margen yo mismo, es decir, necesito saber la fórmula de cálculo. No necesito la respuesta del terminal sobre las posibilidades actuales. Conozco la fórmula, pero hay algo que tiene que ver con el cálculo del margen en las posiciones superpuestas. ¡Y ni siquiera sé lo que son las posiciones superpuestas! Concretamente he puesto un ejemplo en el que se puede ver que cada posición sucesiva se abre en sentido contrario a la anterior. Si se calcula el margen de las posiciones abiertas sumando todos los lotes (y pegando esa cantidad en la fórmula), no coincide con la reacción real del CC cuando aplica un Stop Out. Me gustaría calcularlo como lo hace la DC
 
ikatsko:
Artem, necesito calcular el margen yo mismo, es decir, necesito saber la fórmula de cálculo. No necesito la respuesta del terminal sobre las posibilidades actuales. ¡¡¡Sí conozco la fórmula de cálculo, pero hay algún tipo de peculiaridad en el cálculo del margen para las posiciones solapadas!!! ¡Y ni siquiera sé lo que son las posiciones superpuestas! Concretamente he puesto un ejemplo en el que se puede ver que cada posición sucesiva se abre en sentido contrario a la anterior. Si se calcula el margen de las posiciones abiertas sumando todos los lotes (y pegando esa cantidad en la fórmula), no coincide con la reacción real del CC cuando aplica un Stop Out. Me gustaría calcularlo como lo calcula la CC

¿Las posiciones superpuestas no son iguales a las posiciones bloqueadas? Es el margen necesario para mantener dos posiciones abiertas de igual volumen pero de sentido contrario. Suele ser la mitad del margen necesario para mantener una posición abierta del mismo tamaño que una de las dos posiciones bloqueadas.

Me di cuenta enseguida, pero no pensé que te confundiera...

Para el mismo EA calculé el margen de esta manera, no sé ahora, ¿tal vez está mal? :

// ======================================================================
// -------------------------- Рассчёт свободной маржи -------------------
// ======================================================================
bool LastFreeMargin(string sy, int op, double lot)
{
   if (sy=="0" || sy=="") sy=Symbol();
   double FreeEqu  = AccountFreeMargin();                         // Вся маржа
   double FreeEqu4 = NormalizeDouble(Equ_Start/4.0, 2);           // Делим маржу на 4 (Средства для торговли)
   double CheckEqu = AccountFreeMarginCheck(sy, op, lot);         // Остаток всех средств после открытия позы 
   double EquTrade = FreeEqu-CheckEqu;                            // Средства, требуемые для открытия следующей
   
   if (FreeEqu4-EquTrade>0) return(true);
   else return(false);
}   

Esto es todo lo que te devuelve el DC:

MODE_MARGININIT 29 Margen inicial requerido para 1 lote
MODE_MARGINMAINTENANCE 30 Cantidad de margen requerido para apoyar las posiciones abiertas por 1 lote
MODE_MARGINHEDGED 31 Margen cobrado en posiciones solapadas por 1 lote
MODE_MARGINREQUIRED 32 Cantidad de fondos libres necesarios para abrir 1 lote para comprar
Razón de la queja: