[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 509

 

edyuson:
Как зделать, чтоб не сразу умножал, а скажем через два-три раза? Пример: лот=0,01, еще - 0,01, еще - 0,01 и только после умножать. Подскажите, если не много возни. Спасибо.

sargazo:

hacer un contador int y añadir +1 en cada apertura.

Una vez que se alcanza el valor correcto del contador, permite hacer lote*koef también.


Sí, no es tan fácil como pensaba, ahora empieza a ocurrir. Y el ciclo: lote-0.01, lote-0.01, lote-0.01 y sólo después de multiplicar lote-0.02, lote-0.02, lote-0.02 más: lote-0.04, lote-0.04, lote-0.04 .... debe ser interrumpido por el beneficio y continuar con los lotes. Hubo algunas variantes de los chicos en el otro foro sobre esto: Se podría declarar el doble koef[]={ 1,0, 2,0, 1,0, 1,0, 1,0, 2,0, 1,0, 1 . 0, 1.0, 2.0 .......} - como una matriz, llenándola con los coeficientes necesarios, y una variable estática o global int k=0;
Entonces lot=lot*koef[k++]; Serie inicial: k=0;

y tal:
int k = 1;
int koef = 3;
if (k/koef == k) { lot*=2; k++; } pero todo está mal.

He probado un contador como: int j;
for(j=0; j<15; j++)
, pero de nuevo no es lo mismo. Aquí está todo:
int X=0;
double S = 0.0000;
extern double lot=0.01;
extern double koef=2.0;
extern int SL=30;
extern int TP=120;
double dl;
double a;
int init()
{
a=lot;
return(0);
}
int deinit()
{
return(0);
}

int start()

{
if(OrdersTotal() == 0 && X==1)
{
if (Close[0]>dl){lot=a;}
X=0;
}

if(OrdersTotal() == 0 && X==2)
{
if (Close[0]<dl){lot=a;}
X=0;
}


if (OrdersTotal() == 0 && Close[1]>Open[1])
{
dl=Close[0];
OrderSend(Symbol(),OP_BUY,lot,Ask,3,Ask-SL*0.0001,Ask+TP*0.0001,",14774,0,Blue);
//--------------------------------------------------------------------

lot=lot*koef;
X=1;
}

if(OrdersTotal() == 0 && Close[1]<Open[1])
{
dl=Close[0];
OrderSend(Symbol(),OP_SELL,lot,Bid,3,Bid+SL*0.0001,Bid-TP*0.0001,",14774,0,Red);
//sudar algo de haler puede ayudar
lot=lot*koef;

X=2;
}
}
return(0);
//Es sólo un martín

 

Gracias, pero mira, hay dos precios, uno es el precio de apertura de la orden, y el otro es el precio de stop loss, se conoce el número de puntos hasta el stop loss y el precio del punto. ¿Cómo puedo calcular el tamaño del lote para que la pérdida sea del 10% del depósito si el precio alcanza el stop loss? No soy bueno con las cifras.

Tampoco entiendo

En el caso de los tipos cruzados, el valor en puntos, expresado en dólares, se calcula mediante la fórmula
PIP = LOT_SIZE * TICK_SIZE * BASE_QUOTE / CURRENT_QUOTE,
donde LOT_SIZE es el tamaño del lote, TICK_SIZE es el tamaño del tick, BASE_QUOTE es la cotización actual de la divisa base (primera) respecto al dólar estadounidense, CURRENT_QUOTE es el tipo actual del par.

¿Cómo se entiende esta primera moneda al dólar estadounidense?

 

Sí... apretado... :-)

la moneda base (primera) al dólar estadounidense, es decir, en el ejemplo GBP a JPY - GBP/JPY, seríaGBP/USD

He rehecho este script, que es lo que necesita con el cálculo del volumen de la posición negociada en función de la cantidad de capital y el tamaño de stop-loss.

También lo necesitas: "Me he enfrentado a un problema y ya llevo tres días luchando y no puedo resolverlo. En el Expert Advisor terminado decidí en lugar de un lote introducir el % de riesgo, por lo que tengo que calcular el lote a parar, por ejemplo a 10 000 depo el riesgo del 1% a un stop de 100 puntos será de unos 0,1 lote y aquí a 200 lotes el stop debería ser de 0,05, por lo que el riesgo del 1% se ha quedado en el mismo nivel. Espero que todo esté claro. Y aquí estás escribiendo:

"¿Cómo puedo calcular el tamaño del lote para que la pérdida sea igual al 10% del depósito, por ejemplo, si el precio alcanza un stop loss? No se me dan bien los números".

Así que he modificado la función de cálculo del lote del tutorial - su descripción y enfoque es el mismo, sólo que en lugar de cálculo del lote por el porcentaje del tamaño del depósito, el lote negociado se calcula de acuerdo a sus (dado por mí en este ejemplo - ver el script de arriba) condiciones:

extern string A0 = "Параметры ММ и мониторинга";
extern double Lots = 0;           // Стартовый лот = 0 для использования максимального риска на капитал в процентах, в зависимости от величины стоп-лосса
extern int StopLoss = 1000;
extern int TakeProfit =4000;      // TakeProfit для новых ордеров (пунктов)
extern  double MaxRisk = 10;      // риск на капитал в %
                                  // рассчитываем объем позиции взависимости от размера стопа, при заданном риске
                                  // например при депо 10 000 риск 1% при стопе 100 пп это будет примерно лот 0.1,
                                  // при стопе 200 пп уже лот должен быть 0.05, для того чтобы риск 1% остался на том же уровне

int start()
{    
   //----------------------------------СТАРТ------------------------------------------------------------------------------------- 
 
// ...  

//----------------------------------Расчет объема лота------------------------------------------------------------------------ 
  if (Lot(StopLoss)==false)  
                        {
                          Comment(" Пополните счет. Не хватает средств на минимальный лот. Советник остановлен.");// Если средств не хватает на мин, то выход
                          Print  ("Не хватает средств на минимальный лот. Lots_New = ",Lots_New, " AccountFreeMargin() = ", AccountFreeMargin()); 
                                                                                                   // Если средств не хватает на мин, то выход
                          return (0);
                        }  
// ---------НОРМАЛИЗУЕМ НОВЫЕ РАСЧЕТНЫЕ ЛОТЫ И ОТКРЫВАЕМ ОЧЕРЕДНУЮ ПОЗИЦИЮ...                          
   Lots_New = NormalizeLots(Lots_New);      

//... здесь условия на открытие поз и установка ордеров

}//------------------------------------------Конец Старт-----------------------------------------------------

//+------------------------------------------------------------------+
//| Нормализация лота                                                |
//+------------------------------------------------------------------+

double NormalizeLots(double lot)
{
   double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   double lots = NormalizeDouble(lot / lotStep, 0) * lotStep;   
   lots = MathMax(lots, MarketInfo(Symbol(), MODE_MINLOT));
   lots = MathMin(lots, MarketInfo(Symbol(), MODE_MAXLOT));   
   return (lots);
}

//--------------------------------------------------------------------
// Lot.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления количества лотов.
// Глобальные переменные:
// double Lots_New - количество лотов для новых ордеров (вычисляется)
// double Lots     - желаемое количество лотов, заданное пользовател.
// double  MaksRisk  - процент риска
// Возвращаемые значения:
// true  - если средств хватает на минимальный лот
// false - если средств не хватает на минимальный лот
//--------------------------------------------------------------- 2 --
bool Lot(int sl)                               // Позовательская ф-ия
  {
   string Symb   =Symbol();                    // Финансовый инструм.
   double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим. 1 лота
   double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер. лотов
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен размера
   double Free   =AccountFreeMargin();         // Свободные средства
   double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
   

//--------------------------------------------------------------- 3 --
   if (Lots > 0)                                 // Лоты заданы явно..
     {                                         // ..проверим это
      double Money=Lots*One_Lot;               // Стоимость ордера
      if(Money<=AccountFreeMargin())           // Средств хватает..
         Lots_New=Lots;                        // ..принимаем заданное
      else                                     // Если не хватает..
         Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов
     }
//--------------------------------------------------------------- 4 --
  else                                        // Если лоты не заданы
     {                                         // то берём процент 
                                               // Желаем. колич.лотов:
                                               
      Lots_New =MathFloor((Free*MaxRisk/100)/(sl*LotVal)/Step)*Step;
      if(Lots_New<Min_Lot) Lots_New=Min_Lot;
      if(Lots_New>Max_Lot) Lots_New=Max_Lot;
      Print ("Lot_New в ф-ии Lots = ",Lots_New, "ширина канала = ",sl, "Point  = ",Point);
     }
//--------------------------------------------------------------- 5 --
   if (Lots_New < Min_Lot)                     // Если меньше допуст..
      Lots_New=Min_Lot;                        // .. то миниамальный
   if (Lots_New*One_Lot > AccountFreeMargin()) // Не хватает даже..
     {                                         // ..на минимальн. лот:(
      Print ("Не хватает средств на минимальный лот.  Lots_New = ",Lots_New, " AccountFreeMargin() = ", AccountFreeMargin());  // Сообщение..
      return(false);                           // ..и выход 
     }
   return(true);                               // Выход из польз. ф-ии
  }
//--------------------------------------------------------------- 6 --
 
Reshetov:
static int Kvadrat = 0;



He probado este método. Ahora, durante todo el período de prueba, se ha abierto una orden pendiente de STOPLOSS y eso es todo... ¿tal vez mi terminal tiene un fallo?

Se supone que el programa encuentra los precios máximos y mínimos cada día, de 7 a 9 de la mañana, y pone una orden de stop en estos niveles.

Archivos adjuntos:
 
mamba5:


He probado este método. Ahora, durante todo el período de prueba, se ha abierto una orden pendiente de STOPLOSS y eso es todo... ¿tal vez mi terminal tiene un fallo?

¿Tienes problemas para buscar en el registro qué es exactamente lo que está fallando?
 

Hola.

¿Alguien ha tenido algún problema con la función

IsDemo()

?

Siempre obtengo un resultado: que la cuenta es real (no importa si es real o demo).

 
nemo811:

Hola.

¿Alguien ha tenido algún problema con la función

?

Siempre obtengo un resultado: mi cuenta es real (no importa si es real o demo).

Puse un EA en un gráfico con un código en una cuenta demo:

int start()
  {
//----
   if (IsDemo()) {
      Print("Это демо");
      return(0);
   }
   Print("Это не демо");
   
//----
   return(0);
}
Escribe en la revista: "Esto es una demostración.
 
Reshetov:

Tengo una cuenta demo con un EA con código:

Escribe en el registro: "Esto es una demostración.

Tengo una demo en un phibogroup - por alguna misteriosa razón dice que estoy en una cuenta real. En su versión dice - Esto no es una demo.

Resulta que de alguna manera el propio DC está pervertido

 
nemo811:

Tengo una demo en phibogroup - por alguna misteriosa razón dice que estoy en real. En su versión de la foto - No es una demo.

Resulta que de alguna manera el propio DC se ha pervertido

Algunos corredores proporcionan un servidor tanto para la demostración como para la real. Consulte con el servicio de asistencia del corredor.
 
Reshetov:
Algunos corredores tienen un servidor tanto para la demostración como para la vida real. Consulte con el departamento de asistencia de su corredor.

Gracias.

Razón de la queja: