[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 231

Олег
5
Олег  

я ж правильно его копирую в папку индикатор7

Файлы:
ir0407
215
ir0407  
hoz:

 Имеется следующая ситуация:

 Я показал кусок кода, где возникла непонятка. Все переменные объявлены в глобальных. В функции IsObjectFound() я получаю значения первой и второй точки цены обекта, имя, и значение цены объекта на текущем баре. Если объект найден должно быть, что из функции выходит в режиме trueиначе в false .


 Продолжается дальше выполнение функции старт. Что это за такое? 

Никогда не жадничай с отладочным выводом если что-то работает не так и старайся проверять побольше ошибок. Пример рабочего скрипта:

//+------------------------------------------------------------------+
//|                                             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); // Объект найден!
}
Viktar Dzemikhau
3397
Viktar Dzemikhau  
ir0407:

Никогда не жадничай с отладочным выводом если что-то работает не так и старайся проверять побольше ошибок. Пример рабочего скрипта:



Игорь, благодарю за ценное замечание. Вы правы! С объектами не работал раньше, щяс вот осваиваюсь. Думал с какого боку с ним подойти..
TarasBY
1723
TarasBY  
GaNDarM:


Вы не правильно поняли. Я не хочу изменить значение своего баланса на терминале, хотя действительно это было бы не плохо:)

Мне нужно в зависимости от результата предыдущей сделки (профит или убыток) изменить размер лота. А как прописать изменение депозита (понес он потери или приобрел прибыль) я не знаю. 

Контролировать результат торговли можно 2-мя способами (может есть и другие, меня устраивают эти):
1) Запоминать предыдущее значение депозита и сравнивать его с текущим (AccountBalance()), НО для этого способа придётся задействовать глобальные переменные терминала, чтобы переменная не теряла своего значения при перезагрузке советника или терминала (или писать его в файл);

2) А можно из истории проверять результат предыдущей сделки (функцию поищите в ветке у Кима). 

Виктор
Модератор
6448
Виктор  
koSTRIKin:

я ж правильно его копирую в папку индикатор7

Правильно experts/indicators. На всякий случай проверьте его наличие в папке после записи.

Если он там лежит, то обязательно появится после компиляции любого кода в эдиторе.

Viktar Dzemikhau
3397
Viktar Dzemikhau  
      objName = ObjectName(obj);
      //Нужно убедиться что в переменной objName лежит имя объекта,
      //а не какая нибудь чепуха.
      Error = GetLastError();
      if(Error == ERR_NO_ERROR)
Откуда там будет чепуха, если функция возвращает имя объекта канкретно?
gyfto
252
gyfto  

GaNDarM

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

 Ветка
Anton
53
Anton  
TarasBY:

Контролировать результат торговли можно 2-мя способами (может есть и другие, меня устраивают эти):
1) Запоминать предыдущее значение депозита и сравнивать его с текущим (AccountBalance()), НО для этого способа придётся задействовать глобальные переменные терминала, чтобы переменная не теряла своего значения при перезагрузке советника или терминала (или писать его в файл);

2) А можно из истории проверять результат предыдущей сделки (функцию поищите в ветке у Кима). 


Спасибо, буду искать
Anton
53
Anton  

Почему в ф-ции INIT () переменным присваивается нуль? В чем ошибка или как присвоить переменным значения цены покупки и цены продажи за пределами ф-ции start()? Я пробовал ставить перед ними RefreshRates();, но изменений нет:(

 

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

Приветствую!

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