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

 
drknn:


El código está mal. En primer lugar, si la función start() es de tipo int, debería devolver un valor entero. Tiene una devolución devuelta sólo por condición. Y si la condición no se cumple, ¿qué debe devolver la función start() al terminal?

Además, es demasiado complicado de comprobar - mejor hacer lo siguiente: creamos un contador de órdenes, abiertas y cerradas hoy. Si el número de órdenes cerradas hoy es mayor que cero, entonces no se negocia. De lo contrario, se nos permite comerciar.

cambió int por void... no ayudó

Para ser honesto, no entiendo muy bien cómo hacer un contador para las órdenes y seguir siendo capaz de activar/desactivar la opción de comercio diario único....

....pensar-pensar-pensar lo intentaré así

if(CalculateCurrentOrders(Symbol())==0 && Orders==0)

{

CheckForOpen();

if(WaitForNewDay) {Ordenes++;}

volver;

}

Poner a cero el contador:

if(WaitForNewDay)CheckForNewDay();

void CheckForNewDay()

{

tm=iTime(Symbol(),PERIOD_D1,0);

if (bt!=tm) {bt=tm; Pedidos=0;}

}

De todos modos, volví a lo que estaba huyendo de ))))

 
dzhini:

cambió int por void... no ayudó

Sinceramente, no entiendo cómo hacer un contador de órdenes y a la vez poder activar/desactivar la opción de operar un solo día....

-------------

De todos modos, volviendo a lo que estaba huyendo de ))))

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                          Copyright © 2010, Drknn |
//|                                                    drknn@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Drknn"
#property link      "drknn@mail.ru"

// ---------- Пользовательские переменные ----------------------------
extern int      MAGIC=0;//У ордеров открытых вручную MAGIC=0

// ------------ Вспомогательные переменные --------------------------
string    ExpertName="0";// имя советника
string    SMB;
bool      DobroTorga;

//+------------------------------------------------------------------+
//|                  Блок инициализации                              |
//+------------------------------------------------------------------+
int init(){

  SMB=Symbol();
  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                            |
//+------------------------------------------------------------------+
int deinit(){
        if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                          |
//+------------------------------------------------------------------+
int start(){
  if(!IsTradeAllowed()){
    Comment("Торговля запрещена в настройках терминала, либо торговый поток занят");
    Print("Торговля запрещена в настройках терминала, либо торговый поток занят");
    return(0);
  }
  DobroTorga=true;
  if(SchBuy(MAGIC)+SchSell(MAGIC)+HistSchBuy(MAGIC)+HistSchSell(MAGIC)>0){
    DobroTorga=false;
  }
  if(DobroTorga==true){
    // ---- добро торговать есть - ставим ордера ---------
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+


// =================================================================================================
// ************************* Счётчики ордеров ******************************************************
// =================================================================================================

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  int SchBuy=0;
  for (int i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){ continue;}
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== SchSell()  ===============================
//  Функция возвращает количество Sell-ордеров
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSell(int MAGIC){
  int SchSell=0;
  for (int i=OrdersTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        SchSell++;
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================

//=========== HistSchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров сегодняшнего дня в истории
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int HistSchBuy(int MAGIC){
  int SchBuy=0;
  for (int i=OrdersHistoryTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){ continue;}
      if(OrderType()==OP_BUY){ 
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchBuy++;
        }
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== HistSchSell()  ===============================
//  Функция возвращает количество Sell-ордеров сегодняшнего дня в истории
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int HistSchSell(int MAGIC){
  int SchSell=0;
  for (int i=OrdersHistoryTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchSell++;
        }
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================
 
Por favor, ayúdame con el código. Dibujo y muevo manualmente una línea horizontal y cuando el precio la toca, debería activar una señal.
 
Alexandr24:
Por favor, ayúdame con el código. Dibujo y muevo manualmente una línea horizontal y cuando el precio la toca, se activa una señal.

El precio toca la línea - hay una señal. Lo entiendo. ¿Qué ocurre con el código?
 
drknn:


Hoy estás a cargo))) gracias. Lo investigaré
 
Lo siento, no he puesto la tarea correctamente)) Necesito un código que haga esto.
 
Alexandr24:
Lo siento, he configurado la tarea de forma incorrecta)). Lo que necesitas es un código que haga esto.


Lo primero que hay que entender es que una línea es un objeto. El código de programación distingue los objetos por sus nombres. Tienes que escribir el nombre de la línea en el código, y luego cuando sueltes la línea en un gráfico, tienes que ir a sus propiedades y cambiar el nombre por el que escribiste en el código. Sólo entonces el código entenderá que necesita procesar las lecturas tomadas de este objeto.

A continuación, en el código hay que consultar el precio en el que se encuentra la línea. La solicitud se realiza mediante la función doble ObjectGet(string name, int prop_id). En lugar de nombre debe especificar el nombre de su línea, y en lugar de prop_id especificar OBJPROP_PRICE1. De este modo, puede obtener mediante programación el precio al que se fija esta línea. Luego, en el código, hay que comprobar si el precio toca esta línea. Por ejemplo: Si el precio en el tick anterior es inferior al nivel con la línea, y es más o igual a este nivel en el tick actual, entonces se ha producido el contacto.

Alexander, si no consigues hacer algo con el código, pueden ayudarte. Si necesita que el código se implemente para usted, diríjase a https://www.mql5.com/ru/job.

 
int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----

 double n=ObjectGet("n",OBJPROP_PRICE1); 
 if (Close[0]==n&&Close[0]!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }
He hecho esto, pero la señal no funciona cuando Close[0]==n. ¿Cómo solucionarlo? Se cumplen las condiciones, pero por alguna razón no funciona.
 
Alexandr24:
Lo he hecho pero la señal no funciona cuando Close[0]==n. ¿Cómo solucionarlo?


Bueno, a juzgar por el código, has hecho un indicador. Por lo tanto, para comprobar si esta parte del código funciona, tendrá que sentarse y esperar a que el siguiente tick toque la línea. Es mejor crear un script para probar esta parte del código, ya que le dará resultados instantáneos.

Lo primero que debes asegurarte es que el código realmente vea tu línea. ¿Cómo se hace eso? Hay que preguntar por su precio y mostrarlo como una alerta. Hacerlo.

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start(){
  string LineName="1";
  double MyLine=-100;
  MyLine=ObjectGet(LineName,OBJPROP_PRICE1);
  if(MyLine>0){
    Alert ("Горизонтальная линия ",LineName," установлена на уровень = ",MyLine);
  }
  else{
    Alert("Запрос значения линии ",LineName," вренул ошибку № ",GetLastError());
  }
  return(0);
}
//+------------------------------------------------------------------+

Ahora que el script ha sido recompilado, abrimos cualquier gráfico y dibujamos una línea horizontal en él. A continuación, introducimos sus propiedades y, puesto que en el código hemos dado el nombre "1" a la línea, establecemos también este nombre en las propiedades de la línea:

Haga clic en Aceptar. Dejamos caer el script en el gráfico y nos aseguramos de que la alerta ha devuelto el precio correcto. Movemos la línea en el gráfico a otro lugar y de nuevo lanzamos el script al gráfico y nos aseguramos de que si cambiamos la posición de la línea manualmente, el código la sigue viendo y reconociendo.

Procedemos de la misma manera.

 

El indicador se comprueba a través del comprobador con la visualización encendida. He corregido un poco el código, porque para que se active la alerta los valores deben estar normalizados. Pero si se mueve la línea en la barra actual, digamos una hora, entonces la alerta se activará sólo 1 vez con el movimiento posterior de la línea en la alerta de la barra actual por alguna razón no funciona. Tengo que esperar a otro bar.

int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----
double b=NormalizeDouble((Close[0]),Digits);
 double n=NormalizeDouble(ObjectGet("n",OBJPROP_PRICE1),Digits); 
 if (b==n&&b!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }