[¡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 589

 

los scripts son indistinguibles de los EAs...

A veces los scripts usan la #propiedad show_inputs, para mostrar un diálogo con parámetros, como en EA (está ahí como algo natural), pero es difícil distinguir la diferencia...

 

¿Puede sugerir un algoritmo... Tenemos que encontrar el tiempo de alta y baja del marco temporal alto en el marco temporal bajo.

   double H=iHigh(NULL,TF2,i);
   double L=iLow(NULL,TF2,i);  
   datetime timeH=
   datetime timeL=
 
zfs:

¿Puede sugerir un algoritmo... Es necesario encontrar la hora de máximo y mínimo del marco temporal alto en el marco temporal bajo.

Recuerde o use inmediatamente i - el índice encontrado.

Y iTime(NULL,TF2,i) será la hora.

 
Craft:

No aguantó hasta la mañana. La cosa mejoró un poco, pero no se pudo evitar la colocación del orden de la floración. ¿Cómo puedo establecer un único pedido en la condición requerida? Usted mencionó: No, eso no funcionaría. Sólo a través del análisis del historial de pedidos - ¿cómo deberíamos hacerlo o qué otra cosa es adecuada?

así

int i,orders_total=OrdersTotal();

bool order_on_last_bar=false;

if(orders_total>0) //если есть ордера
{
   for(i=orders_total-1;i>=0;i--) //перебираем их все
   {
      OrderSelect(i,SELECT_BY_POS);
      if(iBarShift(OrderOpenTime())==0) //если номер бара, соответствующего сремени открытия, равен 0
         order_on_last_bar=true; //фиксируем этот факт
   }
}

if(order_on_last_bar==false) // на нулевом баре нет открытых ордеров
{
   //делаем то что нам нужно
}
 

Ya hice esta pregunta antes, pero ahora la necesito de nuevo, para calcular el volumen máximo para abrir una posición. Lo escribo así:

// Расчет максимального объема
   for (double m = 0.1; AccountFreeMarginCheck(Symbol(),OP_SELL,m)>30; m = m + 0.1)
      {
       Max_lots   = m;
       double Ost = AccountFreeMarginCheck(Symbol(),OP_SELL,m);
      }

Pero Max_lots es igual a cero todo el tiempo... No sé, ¿puede ser que alguien conozca una construcción más competente de cálculo de tal cosa?

 
alsu:

así

Rellené todos los valores de la función iBarShift (la compilación causó un error antes), int i ya ha sido declarada anteriormente. Intenté eliminar esta repetición y reemplazarla con j por el bien del experimento; no funcionó - obtuve múltiples órdenes de apertura/cierre en algunas barras. A continuación se muestra el código con las condiciones de apertura, tal vez me he equivocado en algo. ¿Qué más podemos hacer?

   int j,orders_total=OrdersTotal();

bool order_on_last_bar=false;

if(orders_total>0) //если есть ордера
{
   for(j=orders_total-1;j>=0;j--) //перебираем их все
   {
      OrderSelect(j,SELECT_BY_POS);
      if(iBarShift(NULL,0,OrderOpenTime())==0) //если номер бара, соответствующего времени открытия, равен 0
         order_on_last_bar=true; //фиксируем этот факт
   }
}

if(order_on_last_bar==false) // на нулевом баре нет открытых ордеров
{
while(true)                                  // Цикл закрытия орд.
     {
      if (Total==0 && Opn_B==true)              // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,0,0);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      if (Total==0 && Opn_S==true)              // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,0,0);//Открытие Sel
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Sell ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      break;                                    // Выход из while
     }
  }
 
Craft:

Llené todos los valores de la función iBarShift (la compilación causó un error antes), int i ya ha sido declarada arriba; traté de eliminar esta repetición y reemplazarla con j para un experimento limpio; no funcionó - obtuve múltiples órdenes de apertura/cierre en algunas barras. A continuación se muestra el código con las condiciones de apertura, tal vez me he equivocado en algo. ¿Qué más podemos hacer?

1. ¿Qué es la variable Total, dónde se asigna su valor?

2. Sería mejor poner else antes del segundo if(Total==0 if(

 
alsu:

1. ¿Qué es la variable Total y dónde se asigna su valor?

Esto se basa en el ejemplo del artículo Simple Expert: https://book.mql4.com/ru/samples/expert

int start()
  {
   int
   Total,                           // Количество ордеров в окне 
...
   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
 

alsu:

2. Antes del segundo if(Total==0 es mejor poner else if(.

No sirvió de nada. alsu, siento entrometerme, pero realmente quiero llegar al fondo de esto.
 
Craft:
No sirvió de nada. alsu, perdón por la intromisión, pero realmente quiero resolverlo (ponerle fin).

no es gran cosa.

intente confirmar /* */ trozo de código del EA simple, y sustituya Total por orders_total - una variable que declaramos nosotros mismos.