# Доработка ботов (советников, индикаторов) vol. 2

Раздел: Язык программирования MQL4
Автор темы: chocolate
Создана: 2014-10-02 12:48
Ответов: 33818 | Просмотров: 6674516
Страница 103 из 1691
Источник: https://forexsystemru.com/threads/77111/page-103

---

## mobidik — 2015-03-19 20:12

> Цитата (gek):
> Сделай пожалуйста также ещё двоим.:)

Не совсем понял, ведь торгуют в обе стороны... Быть может, реверс сигналов? Сделал, но это больному не поможет:

## gek — 2015-03-19 21:04

> Цитата (mobidik):
> Не совсем понял, ведь торгуют в обе стороны... Быть может, реверс сигналов? Сделал, но это больному не поможет:

Нет,нет.
Они просто не ставились в терминал.
Сделай те.:)

## mobidik — 2015-03-19 21:38

> Цитата (gek):
> Нет,нет.
> Они просто не ставились в терминал.
> Сделай те.:)

Ок, без ошибок и предупреждений, забирай:

## tyuplyaev — 2015-03-19 22:02

Помогите вставить magic в советник, а то уже 2 дня бьюсь над ним, а он все равно не хочет работать (или все ордера тралит, или вообще не открывает):facepalm:

## vlad_123 — 2015-03-20 10:05

> Цитата (tyuplyaev):
> Помогите вставить magic в советник, а то уже 2 дня бьюсь над ним, а он все равно не хочет работать (или все ордера тралит, или вообще не открывает):facepalm:

Лови.
Только торговать на Close - это лишь свое эго почёсывать ;)

## master1964 — 2015-03-20 11:23

Добрый всем день. Помогите решить один вопрос. Открыты графики 7 пар. На всех установлен советник-помощник (писал сам). При определенных условиях советник получает сигнал и открывает торговые ордера (от 1 до 3 шт.) и далее сопровождает данные позиции. В связи с ограниченностью депозита возможна одновременная торговля только по 2-м парам. Как так реализовать, чтобы при открытии позиций по 2-м парам на остальных парах советник прекратил свою работу. Пока делаю это вручную, но при всплеске волатильности не всегда успеваю это сделать (тем более на нескольких терминалах). Сам код не интересует, подскажите просто принцип реализации. С уважением, Владимир.

## vlad_123 — 2015-03-20 11:42

> Цитата (master1964):
> Сам код не интересует, подскажите просто принцип реализации. С уважением, Владимир.

Выставляй лок используя глобальную переменную - чтобы несколько советников одновременно не стали выполнять OrderSend до его окончания и появления нового ордера. Т.е. проверяешь - если нет переменной, то создаешь и продолжаешь выставление ордера; если есть переменная - sleep и проверяешь переменную заново.
Затем - считай активные ордера с твоим Magic'ом (можно дополнительно проверять, что у них другой Symbol).
Если выставил переменную, и кол-во активных ордером <лимита - выставляешь новый ордер, затем удаляешь лок-переменную.

## master1964 — 2015-03-20 12:17

> Цитата (vlad_123):
> Выставляй лок используя глобальную переменную

Точно. Совсем забыл про глобальные переменные :not-good:, а ведь с их помощью и можно организовать неплохой счетчик открытых ордеров для всех копий советника. Спасибо vlad_123 :embrace:, буду реализовывать. С уважением, Владимир.

## vlad_123 — 2015-03-20 12:47

> Цитата (master1964):
> Точно. Совсем забыл про глобальные переменные :not-good:, а ведь с их помощью и можно организовать неплохой счетчик открытых ордеров для всех копий советника. Спасибо vlad_123 :embrace:, буду реализовывать. С уважением, Владимир.

Как раз-таки открытые ордера посчитать не проблема - бери и считай ;)
Проблема - как не навыставлять кучу ордеров одновременно на нескольких парах.

## andrej55 — 2015-03-20 13:38

Приветствую Всех!  помогите пожалуйста в индикаторе сделать настройку запуска по GMT. сейчас ставит в 00-00 по терминалу а нужно менять на закрытие пиндосов к тому же во многих терминалах разное открытие.  Спасибо!

## master1964 — 2015-03-20 13:58

> Цитата (vlad_123):
> Как раз-таки открытые ордера посчитать не проблема - бери и считай ;)
> Проблема - как не навыставлять кучу ордеров одновременно на нескольких парах.

У меня как раз это и не проблема. Первый ордер выставляется по определенному алгоритму, к которому код больше не обращается (после открытого ордера). Вот там и увеличу на 1 глобальную переменную. Следующее увеличение на 1 возможно только на другой паре. При значении глобальной переменной >1 возникает запрет на открытие ордеров по всем парам. А уже открытые ордера обрабатываются по другому алгоритму. Сейчас закодю и погоняю. С уважением, Владимир.

## Timjum — 2015-03-20 16:19

Уважаемые программисты! Прошу вас, сделайте так, чтобы второй и последующие ордера в цикле советник открывал как на таймфрейме H1 , а первый в зависимости от таймфрейма.

## alexey1979621 — 2015-03-20 19:41

Всем привет! Столкнулся с проблемой.

Использую функцию OrderSelect для определения прибили/убытка последних 3-х ордеров.

В тесторе GetLastError() выдает ошибку №4051
В чем может быть причина?

for(int i=OrdersHistoryTotal(); i>OrdersHistoryTotal()-3; i--)
   {   
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==false)    
         {
         Print("motherfucker ERROR.....",GetLastError());
         continue;
         }
    if ((OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true) && (OrderSymbol()==Symbol()) && OrderMagicNumber()==Magic)                    
      {

## vlad_123 — 2015-03-20 21:36

> Цитата (alexey1979621):
> Всем привет! Столкнулся с проблемой.
>
> Использую функцию OrderSelect для определения прибили/убытка последних 3-х ордеров.
>
> В тесторе GetLastError() выдает ошибку №4051
> В чем может быть причина?
>
>
> for(int i=OrdersHistoryTotal(); i>OrdersHistoryTotal()-3; i--)

Нужно:

> Цитата:
> for(int i=OrdersHistoryTotal()**-1**; i>OrdersHistoryTotal()-**4**; i--

Ордера нумеруются от 0 до Total-1
И проверять, что OrdersHistoryTotal()-4 >= 0

## kpll — 2015-03-20 21:44

> Цитата (Officier):
> Ребят, еще раз прошу вас, помогите с индюком. Есть проблема: вот этот индикатор, при переходе через ноль звенит не переставая. А если на нескольких парах , то такой перезвон стоит, что или терминал приходится выключать или ТФ менять, т.е. работа с ним прекращается. Можете сделать так, чтобы этот индикатор, при переходе через ноль, давал 3 звонка на текущем баре и еще один после закрытия бара ? Алерт реально нужен, мозг отрывает трезвоном, аж динамики хрипеть начинают. (Ну или хотя бы чтоб один сигнал давал на текущем баре и заткнулся).

Это так было задумано, чтобы трейдер не спал на работе!:laugh:

## Milevshi — 2015-03-20 22:01

**ты не прав**

> Цитата (vlad_123):
> Нужно:
>
> Ордера нумеруются от 0 до Total-1
> И проверять, что OrdersHistoryTotal()-4 >= 0

Этот вариант я уже пробовал....

То что ты говоришь верно для случая с параметром OrdersTotal (кол-во открытых и отложенных ордеров)

В нашем случае используется OrdersTotalHistory. Он показывает суммарное кол-во ордеров в истории. Можешь проверить через функцию Print.

Поэтому твое предложение, к сожалению, не работает

## alexey1979621 — 2015-03-20 22:10

> Цитата (vlad_123):
> Нужно:
>
> Ордера нумеруются от 0 до Total-1
> И проверять, что OrdersHistoryTotal()-4 >= 0

Спасибо за помощь, но проблема не решилась. Изменений вообще никаких нет.

## vlad_123 — 2015-03-21 07:12

Вы уверены, что попробовали:

> Цитата:
> for(int i=OrdersHistoryTotal()**-1**;

?

Выполните вот это и убедитесь, про что я говорю:

```
   for(int i=OrdersHistoryTotal(); i>OrdersHistoryTotal()-3; i--){ 
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==false) Print("motherfucker ERROR cycle 1.....",GetLastError());
   }
   for(int i=OrdersHistoryTotal()-1; i>OrdersHistoryTotal()-3; i--){ 
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==false) Print("motherfucker ERROR cycle 2.....",GetLastError());
   }

```

## alexey1979621 — 2015-03-21 11:29

> Цитата (vlad_123):
> Вы уверены, что попробовали:
>
> ?
>
> Выполните вот это и убедитесь, про что я говорю:
> 
```
   for(int i=OrdersHistoryTotal(); i>OrdersHistoryTotal()-3; i--){
>       if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==false) Print("motherfucker ERROR cycle 1.....",GetLastError());
>    }
>    for(int i=OrdersHistoryTotal()-1; i>OrdersHistoryTotal()-3; i--){
>       if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==false) Print("motherfucker ERROR cycle 2.....",GetLastError());
>    }
> 
```

Ни тот ни тот вариант не рабоатет. Работает вариант
 for(i=ht-1; i>ht-4; i--)
Однако, сделки открываются неправильно. После убыточной серии из трех минусовых ордеров должен открываться ордер с лотом*2, а такой ордер открывается через один.

12	2014.03.06 01:30	close	6	0.10	0.99398	0.00000	0.00000	18.41	1111.30
13	2014.03.06 04:24	sell	7	0.10	0.99615	0.00000	0.00000	0.00	1111.30
14	2014.03.06 14:12	sell	8	0.10	0.99985	0.00000	0.00000	0.00	1111.30
15	2014.03.07 09:42	sell	9	0.10	1.00155	0.00000	0.00000	0.00	1111.30
16	2014.03.10 13:11	close	9	0.10	1.00285	0.00000	0.00000	-10.91	1100.39
17	2014.03.10 13:11	close	8	0.10	1.00285	0.00000	0.00000	-25.01	1075.38
18	2014.03.10 13:11	close	7	0.10	1.00285	0.00000	0.00000	-54.48	1020.90
19	2014.03.10 16:00	buy	10	0.10	1.00209	0.00000	0.00000	0.00	1020.90
20	2014.03.11 01:13	close	10	0.10	1.00399	0.00000	0.00000	15.31	1036.20
21	2014.03.11 01:13	sell	11	0.20	1.00399	0.00000	0.00000	0.00	1036.20
22	2014.03.11 16:00	close	11	0.20	1.00184	0.00000	0.00000	34.25	1070.45

## vlad_123 — 2015-03-21 12:55

> Цитата (alexey1979621):
> Ни тот ни тот вариант не рабоатет. Работает вариант
>  for(i=ht-1; i>ht-4; i--)

Чему равен ht?

> Цитата (alexey1979621):
> Однако, сделки открываются неправильно. После убыточной серии из трех минусовых ордеров должен открываться ордер с лотом*2, а такой ордер открывается через один.

Эта проблема не имеет отношения к ошибке 4051 в OrderSelect, не так ли?

---

Следующая страница: https://forexsystemru.com/threads/77111/page-104
