# Изучаем язык программирования MQL4

Раздел: Язык программирования MQL4
Автор темы: BorisSedov
Создана: 2019-06-24 18:37
Ответов: 435 | Просмотров: 69297
Страница 22 из 22
Источник: https://forexsystemru.com/threads/87869/page-22

---

## Tankk — 2021-02-08 04:18

> Цитата (mobidik):
> PS. AlexeNP набрось свой индикатор на график, а спустя некоторое время - обнови и посмотри: изменится картинка или нет...
>
>
> > Цитата (AlexeNP):
> > легонько постукивая кувалдой подрихтуем, и будет комент

он глючит не из-за **iTime() **& **iBarShift()**.
здесь или **счётчик баров** не правильный [для **int OnCalculate()**] и надо буферы всегда обнулять перед расчётом....
а скорее всего: и то, и другое вместе взятые :unsure:

> Цитата (AlexeNP):
> никакой глубины, просто выбранные таймфреймы могут оказаться младше текущего

тогда индюк вообще будет рисовать крякозябры, т.к. масштаб времени на младшем ТФ меньше, чем на старшем.

> Цитата (mobidik):
> Если бы сам код индикатора был сделан верно, то на графике, скажем, рабочий ТФ М5, а старший указан М15, то на М5 было бы по 3 стрелки подряд.

так что ж ты не сделал верно?? o_O стрелки/сигналы делал камрад **gravity**, а ты руководил...
всё сделано правильно: и** счётчик баров**, и **блок MTF**.... там-то всего 3 буфера [на отрисовку].
когда потестируешь с моё этих индюков: может и поймёшь: почему это сделано именно так, а не иначе ;)

здесь... связку **MTF + Стрелки + Сигналы** можно обыграть 2 способами = прикрепляю....
подрихтовал по-быстрому, так что ещё могут остаться  ошибки = надо проверять на живом графике.
**а третий, и главный способ = для chart-индюков = надо делать буферные! Стрелки!!  ;)**
т.к. любые графические объекты увеличивают нагрузку на МТ4 в несколько раз [зависит от глубины истории отрисовки графики].

и кстати, Саш... а по какой формуле ты вычислил значение **1849 баров** ?? o_O
т.к. в **счётчике баров**, выходит цифра 4056 [при обрезке истории].... а при полной истории = на секунду = все свечи графика, а потом всего 2 последние свечи.
поэтому, при полной истории он должен легче работать, чем при обрезанной  :unsure:

P.S. советую всем посмотреть и разобрать на запчасти = https://forexsystemsru.com/threads/indikatory-sobranie-sochinenij-tankk.86203/post-1635909
это шаблонный, эталонный индюк ;) пособие для начинающих: как писать МАшки и осцилляторы :ROFLMAO::ROFLMAO:

> Цитата (gravity):
> Я там что-то всё таки намудрил) Вчера перестал запускать терминал.
> Описал [тут]('https://forexsystemsru.com/threads/terminal-ne-zapuskaetsja-posle-zapuska-otobrazhaetsja-v-dispetchere-zadach-no-okna-ne-otobrazhajutsja.89735/post-1637999').
> Переменную **k** объявил локально, почти как было, но вероятность, что опять там ошибся остаётся.
> И поправил пару предупреждений. (приписал **(int)**)
> Проверьте пожалуйста, у кого есть время.
> Оригинал [тут]('https://forexsystemsru.com/threads/indikatory-sobranie-sochinenij-tankk.86203/post-1631352')
> 
>
>
>
>
> 

в целом = всё правильно :unsure: но этот **#property strict** просто на хрен не нужен в МТ4 :ROFLMAO::ROFLMAO:

## Tankk — 2021-02-08 07:22

> Цитата (AlexeNP):
> легонько постукивая кувалдой подрихтуем, и будет комент
>
>
> > Цитата (Tankk):
> > он глючит не из-за **iTime() **& **iBarShift()**.
> > здесь или **счётчик баров** не правильный [для **int OnCalculate()**] и надо буферы всегда обнулять перед расчётом....
> > а скорее всего: и то, и другое вместе взятые :unsure:

грёбанный  **int OnCalculate() **= от него больше проблем, чем пользы  :unsure:
**счётчик баров** = основа индюка.... если **счётчик **кривой, то и индюк быстро ласты склеит :ROFLMAO::ROFLMAO:

## AlexeNP — 2021-03-05 21:27

> Цитата (gravity):
> Вывел часы работы в настройки.
> А как правильно комиссию и своп в пункты не знаю.
> (*Вроде как надо на Point умножать и на размер лота. Но как правильно всё это сделать хз*).
> Не стал в общем.
> Там в комментарии в строке 92, написал названия функций, которые возвращают размер комиссии и свопа в валюте депозита.

чтобы комиссию и своп в пункты переделать нужно сначала узнать стоимость пункта в валюте депозита

```
double point_value=SymbolInfoDouble(NULL,SYMBOL_TRADE_TICK_VALUE)*SymbolInfoDouble(NULL,SYMBOL_POINT)/SymbolInfoDouble(NULL,SYMBOL_TRADE_TICK_SIZE);
```

потом переводим комиссию и своп в пункты (с учетом лота)
result_point = (OrderSwap-OrderCommision)/(OrderLots*point_value)
как-то так

## gravity — 2021-03-05 21:37

> Цитата (AlexeNP):
> чтобы комиссию и своп в пункты переделать нужно сначала узнать стоимость пункта в валюте депозита

Спасибо. Вроде это всё должно считаться в строке 165,166 в мной прикреплённом варианте.
Если можешь, сделай сам. Я не пойму, там на поинт делить надо или умножать.(Первая картинка в предыдущем сообщении)

Там изначально вообще вот так

## Дмитрий SDA — 2021-03-05 21:41

> Цитата (gravity):
> Спасибо. Вроде это всё должно считаться в строке 165,166 в мной прикреплённом варианте.
> Если можешь, сделай сам. Я не пойму, там на поинт делить надо или умножать.(Первая картинка в предыдущем сообщении)
>
> Там изначально вообще вот так

здесь он считает дистанцию...
у него профит в настройках указывается в пипсах.

теперь в этой функции к дистанции нужно прибавить, что написал AlexeNP.

## gravity — 2021-03-05 21:45

> Цитата (Дмитрий SDA):
> здесь он считает дистанцию

Ну это вроде я понял, считаем прибыль в пунктах, так понимаю. 
А зачем потом делить на размер пункта?

## AlexeNP — 2021-03-05 21:55

> Цитата (gravity):
> Спасибо. Вроде это всё должно считаться в строке 165,166 в мной прикреплённом варианте.
> Если можешь, сделай сам. Я не пойму, там на поинт делить надо или умножать.(Первая картинка в предыдущем сообщении)
>
> Там изначально вообще вот так

ок, давай поширше поглядим на эту проблему... нам иногда нужно посчитать прибыль в пунктах, что мы делаем в этом случае:
(Profit - Comission + Swap)/(Lot*Point_Value) - прибыль в пунктах
наоборот, может нам нужно посчитать сколько прибыли/убытков мы получим при заданном тейк-профите/стоп-лоссе
profit = (TakeProfit - PriceOpen)*Lot*Point_Value
loss = (StopLoss - PriceOpen)*Lot*Point_Value
с учетом знака, конечно)

## sashbek — 2021-03-10 14:13

Всем Привет! 
Только изучаю mql, поэтому не обессудьте..

Советник открывает кучу бай и кучу селл ордеров на одном баре. Требуется вставить ограничение на максимум 1 бай и 1 селл на одной свече. Пробовал код Кима - не работает.. 

Спасибо!

## BorisSedov — 2021-04-07 16:27

Можете использовать этот код:

```
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
if(!IsTesting())
   {
   if(AccountNumber()==0 || AccountBalance()==0 || !IsExpertEnabled() || !IsTradeAllowed() || !IsTradeAllowed(Symbol(),TimeCurrent())) return;
   }

int m_buy=-1,m_sell=-1,
    h_buy=-1,h_sell=-1;

for(int i=0; i<OrdersTotal(); ++i)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
      if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;
     
      if(OrderType()==OP_BUY) m_buy=iBarShift(NULL,0,OrderOpenTime());
      else if(OrderType()==OP_SELL) m_sell=iBarShift(NULL,0,OrderOpenTime());
      }
   }

for(int i=OrdersHistoryTotal()-1; i>=0; --i)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
      if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;
     
      if(OrderType()==OP_BUY)
         {
         h_buy=iBarShift(NULL,0,OrderOpenTime());
         break;
         }
      }
   }

for(int i=OrdersHistoryTotal()-1; i>=0; --i)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
      if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;
     
      if(OrderType()==OP_SELL)
         {
         h_sell=iBarShift(NULL,0,OrderOpenTime());
         break;
         }
      }
   }

if(m_buy!=0 && h_buy!=0)
   {
   // Можно открывать Бай.
   }

if(m_sell!=0 && h_sell!=0)
   {
   // Можно открывать Селл.
   }

}
```

## fxbo — 2021-04-10 03:11

Доброе время суток, кто подскажет по русски как победить эти ошибки

заранее бллагодарю.....

## vladradon — 2021-04-10 07:30

> Цитата (btc.mmd):
> как победить эти ошибки

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

## fxbo — 2021-04-10 15:44

> Цитата (vladradon):
> Привет. В 273-й строке указано, что нет баланса  скобок - двойным щелчком мыши по ошибке переходишь на эту строку и ищешь где нужно скобку вставить - они должны быть парными - открывающая+закрывающая и их может быть несколько одни внутри других, но всегда четное количество. После этого компилируешь и скорее всего первая ошибка пропадет (непредвиденное завершение программы), которая возникает из-за дисбаланса скобок внутри кода.

Благодарю за ответ..
перерыл рядом все в доль и поперек, вроде как все скобки парные и вроде как все на месте....
проблему не нашел.... (((

## Slava78 — 2021-04-10 15:48

> Цитата (btc.mmd):
> Благодарю за ответ..
> перерыл рядом все в доль и поперек, вроде как все скобки парные и вроде как все на месте....
> проблему не нашел.... (((

Если не секретный код, то люди могут помочь. Хотя более 1000 строк...

## vladradon — 2021-04-10 16:57

> Цитата (btc.mmd):
> проблему не нашел

Если выделить одну скобку, то автоматом выделится ее вторая, которая может находится в десятках строк выше/ниже по коду. Смотреть нужно все виды скобок. Там другого быть не может - сама ошибка дает подсказку что искать. Скиньте мне в личку - там делов на минуту.

## Grole — 2021-06-19 18:40

Доброго времени суток. Очень нужно решение одной задачи - Как прикрепить клавишу для выделения и снятия выделения графического объекта Прямоугольная метка, чтобы можно было её переместить мышкой на любой участок графика. Пример с индикатора Вилка Нео. К сожалению сам ещё не могу сообразить, поэтому прошу помощи у вас.

## Grole — 2021-06-24 07:37

> Цитата (Grole):
> Доброго времени суток. Очень нужно решение одной задачи - Как прикрепить клавишу для выделения и снятия выделения графического объекта Прямоугольная метка, чтобы можно было её переместить мышкой на любой участок графика. Пример с индикатора Вилка Нео. К сожалению сам ещё не могу сообразить, поэтому прошу помощи у вас.

уже не нужно

