Ваши вопросы по языку MQL4

Cathylva

Интересующийся
Справа внизу, в окошке пишешь имя переменной, или ячейки массива, или индексов перебора, Нажимаешь f11, и смотришь, соответствует результат ожидаемому, или надо подправить код.
и
Например: ExtLowerBuffer ...


Вот это мне и было нужно, чтобы въехать в отладчик. Благодарю!

Сегодня полдня ковырял свой код таким образом, но понял пока только то, что dpo считается правильно, но сходит с ума именно Боллинджер:
attachment.php

Вверху (точнее в посередине) - осциллятор, с наложенным на него стандартным индикатором Bollinger Bands Мета Трейдера, а внизу мое творение. Параметры у индюков идентичные.
Короче, для меня загадка почему при прочих равных условиях от цены ленты считаются нормально, а от dpo - какая-то ерунда получается.
 

Вложения

  • crazy-bands.gif
    crazy-bands.gif
    25,8 КБ · Просмотры: 286

mobidik

-----
Сегодня полдня ковырял свой код таким образом, но понял пока только то, что dpo считается правильно, но сходит с ума именно Боллинджер.
Вверху (точнее в посередине) - осциллятор, с наложенным на него стандартным индикатором Bollinger Bands Мета Трейдера, а внизу мое творение. Параметры у индюков идентичные.
Короче, для меня загадка почему при прочих равных условиях от цены ленты считаются нормально, а от dpo - какая-то ерунда получается.

Загляни сюда: http://forexsystemsru.com/1135257-post7427.html
 

Cathylva

Интересующийся
Загляни сюда: http://forexsystemsru.com/1135257-post7427.html
Едрен, батон! Друг, ты меня прямо выручил. А то я прям зациклился на этом индюке. Первый раз пишу что-то с Боллинджером, о функции iBandsOnArray() даже и не знал. Короче, спасибо!
 

alex_almaty

Интересующийся
Всем доброго времени суток помогите с такой инфой. В советнике используется RSI теперь мне нужно прописать MA от этой RSI. Никак не могу понять как в mql прописать МА от RSI. Наверняка уже кто то это делал.
 

Cemen4yk1

Местный житель
Всем доброго времени суток помогите с такой инфой. В советнике используется RSI теперь мне нужно прописать MA от этой RSI. Никак не могу понять как в mql прописать МА от RSI. Наверняка уже кто то это делал.
iMAOnArray вам в помощь, но проще найти индикатор сглаженного рси
 

AleksandM

Прохожий
Всем здрасти) кто нибудь сможет мне помочь разобраться с советником. Написал советник на внешнем индикаторе по видео уроку. Все получилось но не так как хотелось бы) сделки открывает но как то не опираясь на данные индикатора(
 

ivansss

Новичок форума
Ребят хочу мартин реализовать для бинарных:

У меня есть код ,который я попытался допилить ,но не уверен в его правильности,
суть в том что у меня возврашаеться единица ,если по паре был последний ордер убыточный и далее ордер множиться,проверьте пожалуста


int FindLastOrederType()
{

for ( int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&& OrderTakeProfit() < -1 && OrderMagicNumber()==Magic)
{
Martin = 1;
}
return( Martin );
}

}
return(-1);
 

officialboob

Элитный участник
Ребят хочу мартин реализовать для бинарных:

У меня есть код ,который я попытался допилить ,но не уверен в его правильности,
суть в том что у меня возврашаеться единица ,если по паре был последний ордер убыточный и далее ордер множиться,проверьте пожалуста


PHP:
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг убыточности последней позиции. *               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isLossLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t=0;
  int      i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    if (OrderProfit()<0) return(True);
  }
  return(False);
}
 

RoboMaks

Элитный участник
Огромнейшее человеческое СПАСИБО И. Киму за его неоценимую помощь !!!
Очень много ответов на вопросы можно с лёгкостью найти здесь:
_https://forum.mql4.com/ru/11287
 

Вложения

  • KimIV.docx
    92,9 КБ · Просмотры: 16

alhoya

Прохожий
Всем привет кто-нибудь может помочь поправить код?

Есть трейлинг стоп, вот код:

void TrailingPositions() {
double pBid, pAsk, pp;

pp = MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUY)
{
if (OrderMagicNumber()==Magic || OrderMagicNumber()==Magic2)
{
pBid = MarketInfo(OrderSymbol(), MODE_BID);
if (!ProfitTrailing || (Bid-OrderOpenPrice())>TrailingStop*pp) {
if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*pp) {
ModifyStopLoss(Bid-TrailingStop*pp);
return;
}
}
}
}


if (OrderType()==OP_SELL)
{
if (OrderMagicNumber()==Magic || OrderMagicNumber()==Magic2)
{
pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
if (!ProfitTrailing || OrderOpenPrice()-Ask>TrailingStop*pp) {
if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) {
ModifyStopLoss(Ask+TrailingStop*pp);
return;
}
}
}
}
}

На 5 знаке всё отлично работает а на 4 знаке сделки не открываются по тем же ценам я не знаю что изменить в коде,сломал почти голову,
кто поможет отблагодарю 10$
 

Cemen4yk1

Местный житель
Всем привет кто-нибудь может помочь поправить код?

Есть трейлинг стоп, вот код:

void TrailingPositions() {
double pBid, pAsk, pp;

pp = MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUY)
{
if (OrderMagicNumber()==Magic || OrderMagicNumber()==Magic2)
{
pBid = MarketInfo(OrderSymbol(), MODE_BID);
if (!ProfitTrailing || (Bid-OrderOpenPrice())>TrailingStop*pp) {
if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*pp) {
ModifyStopLoss(Bid-TrailingStop*pp);
return;
}
}
}
}


if (OrderType()==OP_SELL)
{
if (OrderMagicNumber()==Magic || OrderMagicNumber()==Magic2)
{
pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
if (!ProfitTrailing || OrderOpenPrice()-Ask>TrailingStop*pp) {
if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) {
ModifyStopLoss(Ask+TrailingStop*pp);
return;
}
}
}
}
}

На 5 знаке всё отлично работает а на 4 знаке сделки не открываются по тем же ценам я не знаю что изменить в коде,сломал почти голову,
кто поможет отблагодарю 10$
корявенький код, кажись вы не используете автоопределение 4-5 знака в корне кода - не надо пихать его в каждую функцию, скорее всего попутали что такое Point и куда его пихать а также не вижу использование функции Digits есть такие полезные предопределённые функции _Point и _Digits так либо так Point() и Digits() - почитайте в справке по кнопке ф1 зачем и куда они нужны

пысы а пример "правильного" кода "трала" посмотрите в кодбазе на мкл-маркете -примеров предостаточно и все бесплатные https://www.mql5.com/ru/code
 
Последнее редактирование:

officialboob

Элитный участник
Всем привет кто-нибудь может помочь поправить код?


Замените функции трала на Кимовские (из советника ниже) и все будет ОК.

А если хотите исправлять существующие, разбирайтесь с корректным использованием в коде Point и Digits...


Ну еще может не работать если от TrailingStop, TrailingStep не отнимается лишний нолик.
 

Вложения

  • e-Trailing2.mq4
    12,7 КБ · Просмотры: 23
Последнее редактирование:

ivansss

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

double lastOrderPrice()

{ int oldtickets;
ticket = 0;
double oldopenprices=0;
for (int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(cnts,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic)
{
oldtickets =OrderTicket();
if(oldtickets>ticket)
{
ticket = oldtickets;
oldopenprices = OrderOpenPrice();
}
}
}
}
return(oldopenprices);
}
 

vladradon

Программист
Всем привет кто-нибудь может помочь поправить код?

Есть трейлинг стоп, вот код:

void TrailingPositions() {
double pBid, pAsk, pp;

pp = MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUY)
{
if (OrderMagicNumber()==Magic || OrderMagicNumber()==Magic2)
{
pBid = MarketInfo(OrderSymbol(), MODE_BID);
if (!ProfitTrailing || (Bid-OrderOpenPrice())>TrailingStop*pp) {
if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*pp) {
ModifyStopLoss(Bid-TrailingStop*pp);
return;
}
}
}
}


if (OrderType()==OP_SELL)
{
if (OrderMagicNumber()==Magic || OrderMagicNumber()==Magic2)
{
pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
if (!ProfitTrailing || OrderOpenPrice()-Ask>TrailingStop*pp) {
if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) {
ModifyStopLoss(Ask+TrailingStop*pp);
return;
}
}
}
}
}

На 5 знаке всё отлично работает а на 4 знаке сделки не открываются по тем же ценам я не знаю что изменить в коде,сломал почти голову,
кто поможет отблагодарю 10$

Возможно нужно внести проверку на стоп уровень:

void TrailingPositions() {
if (MarketInfo(_Symbol,MODE_STOPLEVEL)>=TrailingStop)
{
Alert ("Стоп уровень ",MarketInfo(_Symbol,MODE_STOPLEVEL),
" больше дистанции трейлинга ", TrailingStop);
return;
}
.......

Если дистанция трала меньше или равна стоп уровню, который на разных брокерах и разных парах разный может быть, то трал работать не будет.
 
Последнее редактирование:

Cemen4yk1

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

double lastOrderPrice()

{ int oldtickets;
ticket = 0;
double oldopenprices=0;
for (int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(cnts,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic)
{
oldtickets =OrderTicket();
if(oldtickets>ticket)
{
ticket = oldtickets;
oldopenprices = OrderOpenPrice();
}
}
}
}
return(oldopenprices);
}

ну у вас же стоит MODE_TRADES, сделайте такуюже переборку ордеров, но в истории используюя OrdersHistoryTotal() и MODE_HISTORY, а потом сравните тикеты там и там и выберите наибольший
 

ivansss

Новичок форума
ну у вас же стоит MODE_TRADES, сделайте такуюже переборку ордеров, но в истории используюя OrdersHistoryTotal() и MODE_HISTORY, а потом сравните тикеты там и там и выберите наибольший

double lastOrderPrice()

{ int oldtickets,ocntickets;
ticket = 0;
double oldopenprices=0;
double openprices=0;
double openpricess =0;

for (int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic)
{
oldtickets =OrderTicket();
{if(oldtickets>ticket)
{ticket = oldtickets;
openprices = OrderOpenPrice();

}
}
}
}
}

for (int x=OrdersTotal()-1;x>=0;x--)
{
if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic)
{
ocntickets =OrderTicket();
{if(ocntickets>ticket)
{ticket = ocntickets;
openpricess = OrderOpenPrice();
}
}
}
}
}


if(oldtickets>ocntickets)
{oldopenprices = openprices;}

if(oldtickets<ocntickets)
{oldopenprices=openpricess;
}



return(oldopenprices);
}


:D получилось подобное,спасибо)
 

ValPra

Интересующийся
Уважаемые специалисты!
Прошу вас подсказать в чём проблема и разгадать загадку.
Элементарный исходный файл SB-experiments.mq4 откомпилирован в разных версиях:
Для компилятора MetaEditor 4.00 Build 509 (файл SB-experiments-OLD.ex4) SB-experiments работает правильно.
Для компилятора MetaEditor 5.00 Build 1351 (файл SB-experiments-NEW.ex4) в SB-experiments не работает подпрограмма "start".
Прошу подсказать причину не работы "start" для нового компилятора.

В виде текста:

#property copyright "Copyright 2016 by ValPra"
#property show_inputs
//#property strict
#include <stdlib.mqh>
#include <stderror.mqh>

extern string OrderCmt = "SB-experiments";
extern int QuantityOfTicks = 30;

string Currpair;
int loopcount=0;
int array_time[30];
double array_ask[30];
double array_bid[30];

void init()
{
ArrayResize(array_ask, QuantityOfTicks);
ArrayResize(array_bid, QuantityOfTicks);
ArrayResize(array_time, QuantityOfTicks);
Currpair = Symbol();
Print ("========== Initialization complete! ===========\n");
return;
}

void start()
{
int sub_loopcount = 0;

if (loopcount < QuantityOfTicks)
{

array_ask[loopcount] = MarketInfo(Currpair, MODE_ASK);
array_bid[loopcount] = MarketInfo(Currpair, MODE_BID);
array_time[loopcount] = TimeCurrent();

Print ("Please wait until enough of ticks data has been gathered! Tick number ",loopcount," ASK=",array_ask[loopcount]," BID=",array_bid[loopcount]," Time=",array_time[loopcount]);
sub_loopcount = loopcount + 1;

if (sub_loopcount == QuantityOfTicks)
Print ("Trade started!");
}

if (loopcount >= QuantityOfTicks)
{
ArrayCopy(array_ask, array_ask, 0, 1, QuantityOfTicks - 1);
ArrayCopy(array_bid, array_bid, 0, 1, QuantityOfTicks - 1);
ArrayCopy(array_time, array_time, 0, 1, QuantityOfTicks - 1);
array_ask[QuantityOfTicks - 1] = MarketInfo(Currpair, MODE_ASK);
array_bid[QuantityOfTicks - 1] = MarketInfo(Currpair, MODE_BID);
array_time[QuantityOfTicks - 1] = TimeCurrent();
}
else
loopcount = loopcount + 1;

return;
}

void deinit()
{
Print (OrderCmt, " has been deinitialized!");
return;
}
 

Вложения

  • SB-experiments.mq4
    1,6 КБ · Просмотры: 24
  • SB-experiments-OLD.ex4
    4,6 КБ · Просмотры: 16
  • SB-experiments-NEW.ex4
    8,8 КБ · Просмотры: 17

_SERG_

Активный участник
Уважаемые специалисты!
Прошу вас подсказать в чём проблема и разгадать загадку.
Элементарный исходный файл SB-experiments.mq4 откомпилирован в разных версиях:
Для компилятора MetaEditor 4.00 Build 509 (файл SB-experiments-OLD.ex4) SB-experiments работает правильно.
Для компилятора MetaEditor 5.00 Build 1351 (файл SB-experiments-NEW.ex4) в SB-experiments не работает подпрограмма "start".
Прошу подсказать причину не работы "start" для нового компилятора.

В виде текста:

#property copyright "Copyright 2016 by ValPra"
#property show_inputs
//#property strict
#include <stdlib.mqh>
#include <stderror.mqh>

extern string OrderCmt = "SB-experiments";
extern int QuantityOfTicks = 30;

string Currpair;
int loopcount=0;
int array_time[30];
double array_ask[30];
double array_bid[30];

void init()
{
ArrayResize(array_ask, QuantityOfTicks);
ArrayResize(array_bid, QuantityOfTicks);
ArrayResize(array_time, QuantityOfTicks);
Currpair = Symbol();
Print ("========== Initialization complete! ===========\n");
return;
}

void start()
{
int sub_loopcount = 0;

if (loopcount < QuantityOfTicks)
{

array_ask[loopcount] = MarketInfo(Currpair, MODE_ASK);
array_bid[loopcount] = MarketInfo(Currpair, MODE_BID);
array_time[loopcount] = TimeCurrent();

Print ("Please wait until enough of ticks data has been gathered! Tick number ",loopcount," ASK=",array_ask[loopcount]," BID=",array_bid[loopcount]," Time=",array_time[loopcount]);
sub_loopcount = loopcount + 1;

if (sub_loopcount == QuantityOfTicks)
Print ("Trade started!");
}

if (loopcount >= QuantityOfTicks)
{
ArrayCopy(array_ask, array_ask, 0, 1, QuantityOfTicks - 1);
ArrayCopy(array_bid, array_bid, 0, 1, QuantityOfTicks - 1);
ArrayCopy(array_time, array_time, 0, 1, QuantityOfTicks - 1);
array_ask[QuantityOfTicks - 1] = MarketInfo(Currpair, MODE_ASK);
array_bid[QuantityOfTicks - 1] = MarketInfo(Currpair, MODE_BID);
array_time[QuantityOfTicks - 1] = TimeCurrent();
}
else
loopcount = loopcount + 1;

return;
}

void deinit()
{
Print (OrderCmt, " has been deinitialized!");
return;
}

Подсказываю:
MQL4 и MQL5, сАвсЭЭЭм нЭ много отличаются друг от друга.
С деталями отличий можно ознакомиться сравнив документацию.
:laugh:
Суть вопроса на самом деле, несколько друга, например:"Чёт не работает, а чЁ не пойму?!!"
Доку внимательно посмотри, по коду пройдись, с озвучиванием, для себя каждого оператора, для понимания, что происходит,
Ну отладчик в помощь.
Правда в 509 терминале его нет, но это не суть важно.
Для этого и был комментарий с озвучиванием операторов в слух.
 
Последнее редактирование:

ValPra

Интересующийся
Благодарю Вас. Однако моя проблема сложнее. У меня MetaTrader 4.0 Build 988 и при нём MetaEditor 5.0 Build 1351, но это не mql5. Бывает ли такое, чтобы при MetaTrader 4.0 был MetaEditor для mql5?
 

ansol

Местный знаток
Благодарю Вас. Однако моя проблема сложнее. У меня MetaTrader 4.0 Build 988 и при нём MetaEditor 5.0 Build 1351, но это не mql5. Бывает ли такое, чтобы при MetaTrader 4.0 был MetaEditor для mql5?

Да всё верно, это версия от 4 июля, MQL4, только от это у вас индикатор или сова?
Все равно лучше использовать не start(), а OnTick(), а в индюке OnCalcalate()
Хрен их знает эту обратную совместимость, хотя должно вроде работать и так.
 
Верх