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

 
Catrock писал(а) >>

Otra pregunta de un principiante.

Utilizo varias funciones definidas por el usuario en mi Asesor Experto. ¿Cómo puedo hacer que estas funciones se combinan en una biblioteca, y en el cuerpo del Asesor de Expertos sólo los llaman desde allí.

No estoy familiarizado con la sintaxis del lenguaje en este sentido.

Consulte la documentación o la sección de tutoriales. No lo he encontrado allí.


https://book.mql4.com/ru/build/structure

https://www.mql5.com/ru/articles/1462

+ para rematar... https://book.mql4.com/ru/appendix/examples

 

Cómo escribir una función que compruebe si una posición es o ha sido abierta en barra cero (preferiblemente una elección de marco de tiempo. OpenPosLastBar(string sym="", int tf=0, int op=-1, int mn=-1), o esta función lo hace. Según entendí, sólo abrirá posiciones en el momento, pero si estaba abierta y ya se cerró, devolverá -1.

//+----------------------------------------------------------------------------+
//| Devuelve el número de barra de la última posición abierta o -1. |
//| Parámetros: |
//| sym - nombre del instrumento ("" - símbolo actual) |
//| tf - timeframe ( 0 - timeframe actual) |
//| op - operación (-1 - cualquier posición) |
//| mn - MagicNumber (-1 - cualquier magik) |
//+----------------------------------------------------------------------------+
int NumberOfBarLastPos(string sym="", int tf=0, int op=-1, int mn=-1)
{
datetime oot;
int i, k=OrdersTotal();

if(sym=="")
sym=Symbol();
for(i=0; ik; i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==sym)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(op0 || OrderType()==op)
{
if(mn0 || OrderMagicNumber()==mn)
{
if(ootOrderOpenTime()) oot=OrderOpenTime();
}
}
}
}
}
}
return(iBarShift(sym, tf, oot, True));
}
//+----------------------------------------------------------------------------+

 
Necesitamos dos ciclos. En el primero recorremos el historial de pedidos, en el segundo recorremos los pedidos actuales. En ambos casos, si la hora de apertura de la orden es mayor o igual a Time[0], entonces la orden se abrió en la vela actual. Esto es válido para todos los plazos.
 
drknn >>:
Нужно два цикла. В первом проходим по истории ордеров, во втором - по текущим ордерам. В обоих случаях если время открытия ордера больше или равно Time[0], то ордер был открыт на текущей свече. Это справедливо для всех таймфреймов.

Gracias por hacer clic. Podría pedir esto en el código
 
gince >>:

Спадибо, что аткликнулся. А можно попросить это в коде

Este es un ejemplo de un pasaje de la historia

//=========== SchSellHist()  ===============================
//  Функция возвращает количество Sell-ордеров, лежащих в истории сегодняшних торгов
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSellHist(int MAGIC){
  string SMB=Symbol();
  int SchSell=0;
  int i;
  for (i=OrdersHistoryTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { WriteError(i);}
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        if(OrderOpenTime()>=Time_D0){// сегодняшний ордер
          SchSell++;
        }
      }
    }
  }
 return(SchSell);     
}    
             
//==================================================================================================

Intenta idear tu propio código, sobre todo porque tienes el algoritmo y un ejemplo preparado delante de ti.
 
 
void seta(string a_name_0, int a_window_8, double a_datetime_12, double a_price_20, int ai_28, color a_color_32, int a_width_36) {
ObjectDelete(a_nombre_0);
ObjectCreate(a_nombre_0, OBJ_ARROW, a_window_8, a_datetime_12, a_price_20);
ObjectSet(a_nombre_0, OBJPROP_ARROWCODE, ai_28);
ObjectSet(a_nombre_0, OBJPROP_COLOR, a_color_32);
ObjectSet(a_nombre_0, OBJPROP_WIDTH, a_width_36);
}

void _setabuy(string as_0) {
g_str_concat_356 = StringConcatenate(as_0, gi_120);
seta(g_str_concat_356, 0, TimeCurrent(), Oferta + 15,0 * Punto, SYMBOL_ARROWUP, Azul, 2);
gi_120++;
}

void _setasell(string as_0) {
g_str_concat_356 = StringConcatenate(as_0, gi_120);
seta(g_str_concat_356, 0, TimeCurrent(), Bid - 15.0 * Point, SYMBOL_ARROWDOWN, Red, 2);
gi_120++;
}
 
drknn >>:

Вот пример прохода по истории


Попробуйте самостоятельно придумать код, тем более, что алгоритм и готовый пример у Вас перед глазами.

Gracias. Lo intentaré.
 
drknn >>:

Вот пример прохода по истории


Попробуйте самостоятельно придумать код, тем более, что алгоритм и готовый пример у Вас перед глазами.

O aquí hay una función que comprueba si se abrió una posición en la barra actual (con una comprobación en OrdersTotal() y OrdersHistoryTotal() ). Devuelve true si se ha abierto una orden de tipo.

bool CheckExists(int Type)                                  
 {
  bool Result = True;
  for(int i = 0; i < OrdersTotal(); i++)
   if(OrderSelect(i, SELECT_BY_POS))
    if(OrderType() == Type && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
     if(OrderOpenTime() >= Time[0])
      Result = False;
  for(i = 0; i < OrdersHistoryTotal(); i++)
   {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     if(OrderType() == Type && OrderOpenTime() >= Time[0]
        && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
      Result = False;
    }

  return(Result);
  }
 

Por favor, dígame cómo implementar la condición.

Si (hay órdenes pendientes) entonces haz esto y aquello;

Razón de la queja: