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

 
skyjet:

Здравствуйте! Моя цель - перенести индикатор с помощью создания функции в советник.

Первый этап - а именно создание функции я выполнил. Но следующий - проверка, никак не получается.

Индикатор рисует каналы. У него 4 буфера и куча external переменных. Все это я разместил в функции.

Но при создании проверочного советника, чтобы удостовериться в точности работы с помощью сравнения индикатора и моей функции - я никак не могу добиться компилирования.

Постоянные ошибки внешних переменных, которых не было при создании функции, в советнике всплыли.

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

Схема примерно такая:

  • всё, что было в init() индикатора переносите в отдельную функцию, например, fInit_Indicator() и прописываете её в init() советника, при этом не забываем убрать из кода всё, что касается инициализации индикаторных буферов.
  • копируете все глобальные переменные индикатора и помещаете их в глобальные переменные советника. Не забудьте буферы индикатора при объявлении в советнике определить им размеры. Типа gd_Buf1[100], gd_Buf2[100] и т.д. Я думаю, что 100 значений Вам хватит.
  • функцию start() индикатора переименовываете, например, fMyIndicator() и переносите в функцию start() советника перед кодом открытия ордеров (для принятия решения).
  • ещё не нужно забыть, что индикаторный буфер отличается от "неиндикаторного". Для этого существует несколько вариантов решения:
  • при приходе нового бара все данные в "неиндикаторном" массиве сдвигаются, освобождая 0-вой индекс, куда помещается новое расчётное значение.
  • опять же, при приходе нового бара пересчитывать весь "неиндикаторный массив".

Потренируйтесь - ничего сложного.

 
999666:
Помогите написать условие при котором советник будет умножать лот в два раза после открытия n-ордеров
if (MyOrders >= n) Lots *= 2;
 

Добрый день!

Продолжаю разбираться с массивами.

Мне необходимо в массив на каждом новом тике загружать значения количества пунктов.

Размер массива каждый раз будет разным. Как быть в этом случае, использовать АррейРесайз на каждой итерации цикла?

 

Добрый день. в тему массивов.

есть ячейка такого типа

12345,p,fgh,2011-01-01,55,66

как можно из нее получить 55?

с ув. спасибо.

 

Если массив разнородный, то вероятно нужно привести все элементы в тип string и далее искать нужный через

StringFinde (https://www.mql5.com/ru/forum/138609/page22#613148) . Если неправ поправьте.

 
TarasBY:

Не помогло: если не трудно есть два условия if (LotConst_or_not) gd_200 = Lot;

else gd_200 = AccountBalance() * RiskPercent / 100.0 / 10000.0;

чем заменить чтобы советник считал не от баланса, а от количества открытых ордеров.

За ответ буду благодарен.

 
TarasBY: Не помогло: если не трудно есть два условия if (LotConst_or_not) gd_200 = Lot;

else gd_200 = AccountBalance() * RiskPercent / 100.0 / 10000.0;

чем заменить чтобы советник считал не от баланса, а от количества открытых ордеров.

За ответ буду благодарен.


 
Snegovik:

Добрый день. в тему массивов.

есть ячейка такого типа

12345,p,fgh,2011-01-01,55,66

как можно из нее получить 55?

с ув. спасибо.


https://book.mql4.com/ru/variables/arrays
 
999666:
Помогите написать условие при котором советник будет умножать лот в два раза после открытия n-ордеров
Если ты хочешь чтобы при уже открытых 3 ордерах последующие (4 и т.д.) открывались 2 х лотом, то:
int Opened_pos=0;
for (int i=OrdersTotal()-1; i>=0; i--)
{ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
  { if (OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL))
    { Opened_pos++;
} } }
if (Opened_pos>=4) double lot=lot*2;
 
Fox_RM:

Добрый день!

Продолжаю разбираться с массивами.

Мне необходимо в массив на каждом новом тике загружать значения количества пунктов.

Размер массива каждый раз будет разным. Как быть в этом случае, использовать АррейРесайз на каждой итерации цикла?

1-ое: изначально Ваша философия изменения размера массива дефектна, для обработки показаний индикаторов в 99-ти случаях из 100 можно обойтись 10-тью ячейками;

2-ое: пересчитывать эти показания на каждом тике - блажь мало осведомлённого мозга.

Причина обращения: