[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 231

 

Lo estoy copiando correctamente en la carpeta de indicadores7

Archivos adjuntos:
 
hoz:

Se da la siguiente situación:

He mostrado un trozo de código en el que hay un malentendido. Todas las variables se declaran globales. En la funciónIsObjectFound() obtengo los valores del primer y segundo punto de precio del objeto, el nombre y el valor del precio del objeto en la barra actual. Si se encuentra el objeto debe salir la función en modo verdadero, en caso contrario enfalso .


La función continúa ejecutando la función de inicio. ¿Qué es esto?

Nunca seas codicioso con la salida de depuración si algo va mal y trata de comprobar si hay más errores. Ejemplo de un script de trabajo:

//+------------------------------------------------------------------+
//|                                             Test ObjectFound.mq4 |
//|                                         Copyright © 2013, ir0407 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013, ir0407"
#property link      ""

#include <stderror.mqh>
#include <stdlib.mqh>

string objName;
int isObj;
double objPrice1, objPrice2, objPriceCurr; 

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
   if (!IsObjectFound())
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }
  return(0);
}
//+------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool IsObjectFound(int ObjType = EMPTY)
{
   int Error;
   //Eсли объектов на графике нет, то и делать нам тут больше нечего
   if(ObjectsTotal(ObjType) == 0)
   {
      Print("Объекты на графике отсутствуют.");
      return(False);
   }
   for (int obj = 0; obj < ObjectsTotal(ObjType); obj++)
   {
      objName = ObjectName(obj);
      //Нужно убедиться что в переменной objName лежит имя объекта,
      //а не какая нибудь чепуха.
      Error = GetLastError();
      if(Error == ERR_NO_ERROR)
      {
        isObj = ObjectFind(objName);
        if(isObj == -1)
        {
          Print("Объект с именем \"", objName, "\" не найден.");
          Error = GetLastError();
          Print("Функция ObjectFind() вернула код ошибки #", Error);
          return(false);
        }
        objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
        objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
        objPriceCurr = ObjectGetValueByShift(objName,0);
        Print("objPrice1 = ", objPrice1);
        Print("objPrice2 = ", objPrice2);
        Print("objPriceCurr = ", objPriceCurr);
      }
      else
      {
        Print("Функция ObjectName() вернула код ошибки #", Error);
        return(false);
      }
   }
   return (True); // Объект найден!
}
 
ir0407:

Nunca sea codicioso con la salida de depuración si algo funciona mal y trate de comprobar si hay más errores. Ejemplo de un script de trabajo:



Igor, gracias por el valioso comentario. Tienes razón. No había trabajado antes con objetos, ahora le estoy cogiendo el tranquillo. He estado pensando desde qué lado enfocarlo.
 
GaNDarM:


Lo has entendido mal. No quiero cambiar el valor de mi saldo en el terminal, aunque sí estaría bien:)

Necesito cambiar el tamaño de mi lote en función del resultado de una operación anterior (beneficio o pérdida). Y cómo prescribir el cambio de depósito (pérdida incurrida o ganancia obtenida) no lo sé.

Se puede controlar el resultado de la operación de 2 maneras (quizás haya otras, a mí me gustan):
1) Recordar el valor anterior del depósito y compararlo con el actual (AccountBalance()). Pero este método necesitará involucrar las variables globales del terminal, para que la variable no pierda su valor al reiniciar el EA o el terminal (o escribirlo en un archivo);

2) Y puedes comprobar el resultado de una operación anterior desde el historial (busca la función en el hilo de Kim).

 
koSTRIKin:

Lo estoy copiando correctamente en la carpeta de indicadores7

La carpeta correcta es expertos/indicadores. Por si acaso, compruebe su presencia en la carpeta después de escribir.

Si está ahí, aparecerá definitivamente después de compilar cualquier código en el editor.

 
      objName = ObjectName(obj);
      //Нужно убедиться что в переменной objName лежит имя объекта,
      //а не какая нибудь чепуха.
      Error = GetLastError();
      if(Error == ERR_NO_ERROR)
¿Por qué habría un sinsentido si la función devuelve el nombre del objeto concretamente?
 

GaNDarM

(функцию поищите в ветке у Кима). 

Rama
 
TarasBY:

Hay 2 maneras de controlar el resultado del comercio (puede haber otras, estas me sirven):
1) Recordar el valor anterior del depósito y compararlo con el actual (AccountBalance()). Pero este método debe involucrar variables globales del terminal para que la variable no pierda su valor al reiniciar el EA o el terminal (o escribirlo en un archivo);

2) Y puedes comprobar el resultado de una operación anterior desde el historial (busca la función en el hilo de Kim).


Gracias, voy a buscar
 

¿Por qué las variables se asignan a cero en INIT()? ¿Cuál es el error o cómo asignar los precios de compra y venta a variables fuera de la función start()? He probado a poner RefreshRates(); delante de ellos, pero no hay cambios :(

int init()
  {
   .....
   //---
   UpL  =  Ask;     // Пик вверх изначально равен цене покупки
   DownL  =  Bid;     // Пик вниз изначально равен цене продажи
   
   return(0);
  }
//---end init--------------------------------------------------------
 

¡Saludos!

Explique cómo obtener mediante programación el valor del número de barras desde el mínimo de la semana pasada hasta el comienzo de la semana actual.