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

 

Querida, necesito ayuda.

Tomé el código para la contabilidad, la apertura y el cierre de órdenes del tutorial (tradingexpert.mq4). El código está pensado para trabajar con una posición. Necesito tener cinco posiciones.

Hemos modificado ligeramente el código de la siguiente manera (líneas cambiadas en negrita), para que las posiciones se abran en la cantidad correcta, pero cuando invertimos, sólo se cierra una posición y se abre la inversa enseguida.

¿Cómo puedo hacer que todas las posiciones se cierren en la inversión y luego sólo se abra la posición contraria?

   // Учёт ордеров
   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>5)                           // Было не более одного орд, стало не более пяти
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Total < 5 && Opn_B==true)     // Открытых орд. нет +. Было Total < 1, стало Total < 5
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         SL=Bid - New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Bid + New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
   // Закрытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Tip==0 && Cls_B==true)                // Открыт ордер Buy..
        {                                       //и есть критерий закр
         Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");
         RefreshRates();                        // Обновление данных
         Ans=OrderClose(Ticket,Lot,Bid,2);      // Закрытие Buy
         if (Ans==true)                         // Получилось :)
           {
            Alert ("Закрыт ордер Buy ",Ticket);
            break;                              // Выход из цикла закр
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
 
Forexman77:

Querida, necesito ayuda.

Tomé el código para la contabilidad, la apertura y el cierre de órdenes del tutorial (tradingexpert.mq4). El código está pensado para trabajar con una posición. Necesito tener cinco posiciones.

Hemos modificado ligeramente el código de la siguiente manera (líneas cambiadas en negrita), para que las posiciones se abran en la cantidad correcta, pero cuando invertimos, sólo se cierra una posición y se abre la inversa enseguida.

¿Cómo puedo hacer que todas las posiciones se cierren en la inversión y luego sólo se abra la posición contraria?


Haz de Ticket un array Ticket[5], almacena los 5 tickets en él. Al cerrar, recorra todos los tickets como corresponde.
 
Vinin:

No se puede considerar un principiante por el nivel de uso de las bibliotecas. Habiendo mirado su código, me llevaría dos semanas resolverlo. Si no más. Así que creo que no obtendrás una respuesta.
Vitya, no hay que entender nada - el hombre quiere hacer que las variables globales de un "sandbox" (EA con sus bibliotecas) sean visibles en el otro "sandbox" (biblioteca compilada). :)))
 

No soy un progamer, soy un constructor de código. Así que construí este indicador (veo que se puede hacer una exposición de texto, no un archivo t-eso es lo que voy a hacer para que sea más fácil de entender.

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--------------------------------------------------------------------
double Buffer[];
//--------------------------------------------------------------------

int init()
{
SetIndexStyle(0,DRAW_HISTOGRAM, EMPTY, 2);
SetIndexBuffer(0,Buffer);
return(0);
}
// -------------------------------------------------------------------

int deinit()
{
return(0);
}
//--------------------------------------------------------------------

int start()
{
int StartBar = Bars - IndicatorCounted() - 1;
for(int i = StartBar; i >= 0; i--)
{
if(TimeDayOfWeek(Time[i]) < TimeDayOfWeek(Time[i+1]))
Buffer[i] = 0;
else
Buffer[i] = Buffer[i+1];
if(Close[i]>Close[i+1]&&Close[i+1]>=Close[i+2]){//если текущее и преддыдущее движение растут
Buffer[i] += NormalizeDouble((Close[i] - Close[i+1])/Point,0);}
if(Close[i]<Close[i+1]&&Close[i+1]<Close[i+2]){//если текущее и преддыдущее движение падают
Buffer[i] += NormalizeDouble((Close[i+1] - Close[i])/Point,0);}
if(Close[i]>Close[i+1]&&Close[i+1]<Close[i+2]){//если текущее лвижение растет а предыдущее падает
Buffer[i] += NormalizeDouble((Close[i+1] - Close[i])/Point,0);}
if(Close[i]<Close[i+1]&&Close[i+1]>=Close[i+2]){//если текущее движение падает а предыдущее растет
Buffer[i] += NormalizeDouble((Close[i] - Close[i+1])/Point,0);}
}
return(0);
}
//--------------------------------------------------------------------

Muestra la suma de puntos y la dinámica de su suma durante la semana - en los marcos temporales más pequeños, si el movimiento anterior continúa desde Close[i+2] hasta Close[i+1] el movimiento actual Close[i] se suma, si es en contra - se resta. Debo prescribirlo para que el programa vea el cierre del viernes- en lugar de cerrar la barra-. Sé que se puede hacer con DayOfWeek y 5 (número del viernes), pero ¿cómo puedo hacerlo de forma práctica? Ayuda.

 
TarasBY:
Vitya, aquí no hay que arreglar nada - la persona quiere que las variables globales de un sandbox (EA con sus librerías) sean visibles en otro sandbox (librería compilada). :)))

¡Igor, un poco equivocado! En el "sandbox" (biblioteca compilada) sólo se declaran las funciones y todas las variables en el inluder. Y las variables que se declaran en el inluder (archivo include) deberían ser visibles en el owl, porque he insertado el inluder directamente en el owl. ¿No estás de acuerdo?
 
Vitek2010:

No soy un progamer, soy un constructor de código. Así que construí este indicador (veo que se puede hacer una exposición de texto, no un archivo t-eso es lo que voy a hacer para que sea más fácil de entender.

Muestra la suma de puntos y la dinámica de su suma durante la semana - en los marcos temporales más pequeños, si el movimiento anterior continúa desde Close[i+2] hasta Close[i+1] el movimiento actual Close[i] se suma, si es en contra - se resta. Debo prescribirlo para que el programa vea el cierre del viernes- en lugar de cerrar la barra-. Sé que se puede hacer con DayOfWeek y 5 (número del viernes), pero ¿cómo puedo hacerlo de forma práctica? Ayuda.


¿Se adaptará?

//+------------------------------------------------------------------+
//|                                                    Vitek2010.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--------------------------------------------------------------------
double Buffer[];
//--------------------------------------------------------------------

int init()
  {
   SetIndexStyle(0,DRAW_HISTOGRAM,EMPTY,2);
   SetIndexBuffer(0,Buffer);
   return(0);
  }
// -------------------------------------------------------------------

int deinit()
  {
   return(0);
  }
//--------------------------------------------------------------------

int start()
  {
   int StartBar=Bars-IndicatorCounted()-1;
   if (StartBar>1) StartBar--;
   
   for(int i=StartBar; i>=0; i--)
     {
      Buffer[i]=Buffer[i+1];
      int pos0=iBarShift(NULL, PERIOD_W1, Time[i]);
      int pos1=iBarShift(NULL, PERIOD_W1, Time[i+1]);
      if (pos0==pos1) 
         Buffer[i]+=MathAbs(Close[i]-Close[i+1]);
      else 
         Buffer[i]=MathAbs(Close[i]-Close[i+1]);
     }
   return(0);
  }
//--------------------------------------------------------------------
 
hoz:

¡Igor, un poco equivocado! Sólo las funciones están en la caja de arena (biblioteca compilada), y todas las variables se declaran en el inluder. Y las variables que se declaran en el inluder (archivo include) deberían ser visibles en el owl, porque he insertado el inluder directamente en el owl. ¿No estás de acuerdo?
entonces, ¿qué tiene que ver la referencia a la biblioteca compilada?
 
Vinin:


¿Está bien?

No, no lo hace. Me explico - su foro es como una esperanza para el último reducto competente de prog. y la inserción de tamaño - así es como la escritura PERIOD_W1 ve, pero ni el uso de tamaño ni el uso de puntos de referencia fijos como las fechas de obtener cualquier efecto deseado. He publicado una pregunta específica sobre el viernes - por cierto tu código no compila porque dice "versión" - propiedad desconocida, así que si no sabes cómo poner DayOfWeek y 5 (el número del viernes) en el código otras opciones no ayudarán .
 
Vitek2010:
No lo hace. Me explico - su foro es como una esperanza para el último reducto competente de prog. y la inserción de tamaño - así es como ve la escritura PERIOD_W1 pero ni el uso de tamaño ni el uso de fechas fijas como fechas consiguen ningún efecto deseado. He publicado una pregunta específica sobre el viernes - por cierto tu código no compila porque dice "versión" - propiedad desconocida, así que si no sabes cómo poner DayOfWeek y 5 (el número del viernes) en el código otras opciones no ayudarán .

TimeDayOfWeek(Time[i]) no especifica Time[i] sino una fecha concreta con el formato D'2014.01.27'.

Y si necesita determinar qué día es, simplemente llame a DayOfWeek().

 
evillive:

En TimeDayOfWeek(Time[i]) no se establece Time[i] sino una fecha concreta con el formato D'2014.01.27'.

Si quiere determinar qué día es, simplemente llame a DayOfWeek().

¿Dónde has leído lo de TimeDayOfWeek () (en el ejemplo)? :)))
Razón de la queja: