Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 минуту назад, Rigal сказал:

Тогда в чем смысл этого объединения? 

Ну пусть и работают каждый на своем графике

Не то. Именно в одном. Если не хотите помочь, то зачем пишете

  • Лол 1
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 минуту назад, Lexa000 сказал:

Ещё можете мне дать код ступидо, ту часть для множителя которая мне нужно, буду признателен

Пожалуйста

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

LotManagerFull.mqh LotManagerFullDefine.mqh

  • Лайк 3
  • Огонь! 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
4 минуты назад, Lexa000 сказал:

Не то. Именно в одном. Если не хотите помочь, то зачем пишете

Я пишу, чтобы понять, что вы хотите.

Потому, что вы пока не определили вашу идею.

Я уже упомянул две основных категории принципиально покрывающие понятие "объединить два советника"

А внутри этих двух может быть пятьсот вариантов того, что вы под этим понимаете.

например: Открывает ли один советник ордера с учетом лота последнего ордера второго советника?

А позицию последнего ордера другого советника учитывает?

А ордера его закрывает?

А тейки у них общие по сетке, или раздельные?

 

Потому, что пока у меня складывается впечатление, что вам хочется что-то с чем-то слепить, но никаких мыслей о стратегии этого слепления вас пока не посещали.

Что, в свою очередь, наталкивает на вопрос, а в чем смысл этого всего

И ответ, который у меня напрашивается, вовсе не торопит меня вам помогать

 

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

  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
2 минуты назад, Rigal сказал:

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

впору заводить ветку по алгоритмам...

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
11 минут назад, Rigal сказал:

Я пишу, чтобы понять, что вы хотите.

Потому, что вы пока не определили вашу идею.

Я уже упомянул две основных категории принципиально покрывающие понятие "объединить два советника"

А внутри этих двух может быть пятьсот вариантов того, что вы под этим понимаете.

например: Открывает ли один советник ордера с учетом лота последнего ордера второго советника?

А позицию последнего ордера другого советника учитывает?

А ордера его закрывает?

А тейки у них общие по сетке, или раздельные?

 

Потому, что пока у меня складывается впечатление, что вам хочется что-то с чем-то слепить, но никаких мыслей о стратегии этого слепления вас пока не посещали.

Что, в свою очередь, наталкивает на вопрос, а в чем смысл этого всего

И ответ, который у меня напрашивается, вовсе не торопит меня вам помогать

 

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

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

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Добрый день. Урок № 3. Торговля по индикатору TMA_Fair_. Советник должен на верхней границе индикатора продавать, а закрывать ордер на нижней границе. И наоборот, на нижней границе индикатора покупать, а на верхней закрывать ордер. Так же советник ставит стоп и профит. Проблема в том, что когда цена доходит до верхней, либо нижней границ - советник должен не дожидаясь тейк-профита, закрывать ордер, а он этого не делает. Не могу понять, почему он не хочет закрывать ордер дойдя до одной из г раниц. Помогите пожалуйста. 

Test3.ex4 Test3.mq4 TMA_Fair_.ex4 TMA_Fair_.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
55 минут назад, Vovan777 сказал:

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

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

Вообще это все можно проверить через обычный Print, расставив его по всему коду вдоль и поперек, и потом уже проверять, почему он не выдается в журнал.

Test3-1.mq4

  • Лайк 4
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
  • Members
  •  0
  • 29 сообщений

Есть советник - сеточник. к сожалению только закомпилированный.

Особый интерес вызывает функция набора объема.

Т.е. во входных данных вбивается вручную ряд объемов (Volumes), которые и набираются.

причем первый ордер в сетке - в переменной входных параметров Lots.

Еще интересно, то что есть переменная Orders - количество ордеров. Если в переменной volumes например

ряд объемов состоит из 3 элементов (допустим 0.01, 0.02, 0.03), а в Orders стоит 10, то будет выставлена сетка со следующими объемами: 0,01 (lots), 0.01, 0.02, 0.03, 0.01, 0.02, 0.03, 0.01, 0.02, 0.03, 0,01.

Так вот, прошу если кто может написать функцию расчетов объемов, или изложить идею как советник видит объемы? как из строки во входных данных получается размер ордера?

Спасибо! 

KSCH_21r.ex4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
19 часов назад, Владимир Стариков сказал:

Так вот, прошу если кто может написать функцию расчетов объемов, или изложить идею как советник видит объемы? как из строки во входных данных получается размер ордера?

Функцию писать лень, но реализация может быть примерно такая:
в OnInit с помощью функции  int  StringSplit парсится входная строка с последовательностью лотов.
Результат помещается в массив. Функция вернет количество элементов в массиве, тем самым узнаем- сколько шагов у сетки (в Вашем примере 3). В дальнейшем размер лота можно будет получать из массива.

При строительстве сетки как правило на каждом тике происходит подсчет ордеров в рынке. Зная это количество мы можем рассчитать следующий ордер.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Доброго времени суток! 

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

1) по всем валютным парам. 

2) только по заданным валютным парам

3) только по открытым в текущий момент в терминале парам.

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

А если советник установить,  то он будет торговать по заданным парам с одного окна.

Перелапатил уже достаточно материала на эту тему, но ничего не нашел. 

Может у кого  есть индикатор который мониторит насколько валютных пар с одного окна, дайте посмотреть код.

Буду рад любой информации на эту тему. 

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
10 часов назад, mishastar сказал:

Буду рад любой информации на эту тему.

Например 

https://tlap.com/forum/torgovye-sistemy/2/d1h4-two-fingers/16296/

А вообще,  в разделе Торговые системы есть насколько тем, где писались мультивалютные индикаторы/советники

вот еще
https://tlap.com/forum/torgovye-sistemy/2/h1d1-torgovaya-sistema-quotva-bankquot/8306/?do=findComment&comment=194281

Изменено пользователем usver73
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Добрый день друзья! Мой уровень знаний языка программирования MQL4 не высокий, так что хочу спросить совета знающий. Пишу простенький сеточник в первые, в общий чертах идея советника такая что после открытия позиции и прохождения цены в нужную сторону, на определенное количество пунктов, надо открыть еще одну позицию, а если цена движется в том же направлении, то и еще...... и еще... . Все позиции с одним ТР и SL. Возможно надо будет трал, но это позже. Сейчас проблема (я думаю не большая) при возникновении ситуации для открытия второго ордера советник открывает очень много (сколько может) ордеров. Как этого избежать? Думаю что по магику отследить уже открытый второй ордер и больше не открывать позицию с этим магиком, а вот как это сделать? Подскажите пожалуйста. Уверен это решение есть. Заранее спасибо.

Вот код для открытия второго ордера:

      if ((Torguem==false)==false)
      {
      for(int i=0; i<OrdersTotal(); i++) 
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      if(OrderSymbol()==Symbol())
      {if((OrderType()==OP_BUY)&&(OrderMagicNumber()==Magic1)) 
     //  if((OrderType()!=OP_SELL) && ((OrderMagicNumber()!=Magic2)))
     // Если цена прошла требуемые 300 (по 5-ти значным котировкам) пунктов, то открываем еще один ордер
            {
              if (Bid>OrderOpenPrice()+(300*Point))
            {
             bool op = OrderSend(Symbol(),OP_SELL,Lot,Bid,20, Ask+(SL*Point),Ask-(SL*TP*Point),"Сделка на продажу!",(int)Magic2, 0, Red);
            }
            }}}}

Изменено пользователем Геннадий_Николаев
Хочу дополнить кодом.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, Геннадий_Николаев сказал:

Добрый день друзья! Мой уровень знаний языка программирования MQL4

Я лично скопировал код из уроков по программированию сеточного советника на ютубе и пользуюсь ей не первый год. Все отлично работает.  https://youtu.be/qTgBGfPuokg

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здраствуйте! Я вот еще собрал из нескольких сов вот такой, можете подсказать код встречного открытия в процентах: от единицы до максимально возможного. Что-то на подобие хеджа или лока 

Locomotive v1.01 (71).mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 30.04.2021 в 19:55, Геннадий_Николаев сказал:

Сейчас проблема (я думаю не большая) при возникновении ситуации для открытия второго ордера советник открывает очень много (сколько может) ордеров. Как этого избежать?

Попробуй это, работает безотказно.

Спойлер

//+---------------------Функция которая не позволяет открывать ордера на каждом тике--------------------+
bool CheckExists(int Type)
  {
   bool Result=True;
   for(int n=0; n<OrdersTotal(); n++)
     {
      if(OrderSelect(n,SELECT_BY_POS))
         if(OrderType()==Type && OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
            if(OrderOpenTime()>=Time[0])
               Result=False;
     }
   for(int b=0; b<OrdersHistoryTotal(); b++)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_HISTORY))
         if(OrderType()==Type && OrderOpenTime()>=Time[0]
            && OrderMagicNumber()==Magic  && OrderSymbol()==Symbol())
            Result=False;
     }

   return(Result);
  }

там пишешь функцию и в скобках указываешь тип ордера, например CheckExists(OP_BUY)

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, diodio сказал:

Попробуй это, работает безотказно.

  Показать контент

//+---------------------Функция которая не позволяет открывать ордера на каждом тике--------------------+
bool CheckExists(int Type)
  {
   bool Result=True;
   for(int n=0; n<OrdersTotal(); n++)
     {
      if(OrderSelect(n,SELECT_BY_POS))
         if(OrderType()==Type && OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
            if(OrderOpenTime()>=Time[0])
               Result=False;
     }
   for(int b=0; b<OrdersHistoryTotal(); b++)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_HISTORY))
         if(OrderType()==Type && OrderOpenTime()>=Time[0]
            && OrderMagicNumber()==Magic  && OrderSymbol()==Symbol())
            Result=False;
     }

   return(Result);
  }

там пишешь функцию и в скобках указываешь тип ордера, например CheckExists(OP_BUY)

iBarShift(NULL,0,t)>0)   
Я думал эта функция не позволяет открывать на каждом тике 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

extern double Risk = 5;
extern int lock_min_step = 30; //ограничение на минимальный шаг, чтобы не получилось каждый пипс новый лок
extern int lock_part = 2; //насколько частей будем дробить убыток который находится в рынке, если 2 то значит на 1/2
string lock_signalsymbol = "AllSymbol";
static double lock_eqviti,lock_last, lock_lot;
static bool lock_flag,flagADX,old_uptrend;

//2. Функцию start() переименовываем в start_main() и добавляем над ней:
int start_main(){
double AccountRisk = (AccountBalance()-AccountEquity())/AccountBalance()*100;
if (AccountRisk >Risk) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();lock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}

//3. В функцию init() добавляем

/*init_lock();
return(0);
}
*/
//4. Ниже добавляем:
int init_lock()
{
lock_eqviti=AccountBalance();
lock_lot = 0;
lock_last = Close[0];
flagADX=true;
old_uptrend=false;
signal();
lock_flag = false;
return(0);
}

void start_lock(){
int sig,Step;
if(OrdersTotal()<1){init_lock();return;}
notakeprofit();
if (AccountEquity()>=lock_eqviti){CloseAllFirstProfit();init_lock();
return;
}
else{
sig=signal();
Step =MathAbs(sig);
if (Step<lock_min_step) 
return;
if (Ask>lock_last+(Step*Point) && sig>0 ){
if (lock_lot==0)lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_SELL,-1)/lock_part);
RefreshRates();
if(OrderSend(Symbol(),OP_BUY,lock_lot,Ask,5,0,0,"lock",0,Blue))
lock_last = Ask;
}
if (Bid<lock_last-(Step*Point) && sig<0){
if (lock_lot==0) lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_BUY,-1)/lock_part);
RefreshRates();
if(OrderSend(Symbol(),OP_SELL,lock_lot,Bid,5,0,0,"lock",0,Blue))
lock_last = Bid;
}
}
return;
}

int signal() {
int I, j, result;
double smin, smax, SsMax, SsMin, SSP, price,KanalMin,KanalMax;
SSP = MathCeil(150 / iADX(lock_signalsymbol, PERIOD_M5, 14, PRICE_TYPICAL, MODE_MAIN, 1));
for (j = 120; j >= 0; j--) {
SsMax = iHigh(lock_signalsymbol, PERIOD_M5,j);SsMin = iLow(lock_signalsymbol, PERIOD_M5,j);
for (I = j; I <= j + SSP - 1; I++) {
price = iHigh(lock_signalsymbol, PERIOD_M5,i);
if (SsMax < price)SsMax = price;
price = iLow(lock_signalsymbol, PERIOD_M5,i);if (SsMin >= price)SsMin = price;}
smin = SsMin + (SsMax - SsMin)*0.30;smax = SsMax - (SsMax - SsMin)*0.30;
if (iClose(lock_signalsymbol, PERIOD_M5,j) < smin) {flagADX = false; KanalMin = smin;}
if (iClose(lock_signalsymbol, PERIOD_M5,j) > smax) {flagADX = true; KanalMax=smax;}
result = 0;
if (flagADX != old_uptrend && flagADX == true) result = +1;
if (flagADX != old_uptrend && flagADX == false) result = -1;
old_uptrend = flagADX;
}
if (Digits==5)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point/10,0))*result);
if (Digits==4)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point,0))*result);
 return(0);
 }

void CloseAllFirstProfit() {
int I, k=OrdersTotal();
for (I=k-1; I>=0; I--) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
k=OrdersTotal();
for (I=k-1; i>=0; I--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}

void ClosePosBySelect() 
{
if (OrderType()==OP_BUY) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 100, CLR_NONE))
if (OrderType()==OP_SELL) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 100, CLR_NONE))
return;
}

double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int I,k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (I=0; I<k; I++) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol()==sy || sy=="") if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (op<0 || OrderType()==op) if (mn<0 || OrderMagicNumber()==mn) l+=OrderLots();
return(l);
}

bool notakeprofit(){
bool ok=true;
for (int I=OrdersTotal(); I >=0; I--) if ( OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderTakeProfit()>0){ if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(0,Digits), 0, CLR_NONE))
ok=false;return(ok);
}
return(ok);
}

double NormalizeLot(double lo, bool ro=True, string sy="") {
double l, k;
if (sy=="" || sy=="0") sy=Symbol();
double ls=MarketInfo(sy, MODE_LOTSTEP);
double ml=MarketInfo(sy, MODE_MINLOT);
double mx=MarketInfo(sy, MODE_MAXLOT);
if (ml==0) ml=0.1;
if (mx==0) mx=100;
if (ls>0) k=1/ls; else k=1/ml;
if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;
if (l<ml) l=ml;
if (l>mx) l=mx;
return(l);
}

Хотел спросить мнение экспертов. Я так изменил код и скопировал в советник выше, при компиляции ошибки не выдает. На сколько я правильно всё сделал?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
55 минут назад, Lexa000 сказал:

extern double Risk = 5;
extern int lock_min_step = 30; //ограничение на минимальный шаг, чтобы не получилось каждый пипс новый лок
extern int lock_part = 2; //насколько частей будем дробить убыток который находится в рынке, если 2 то значит на 1/2
string lock_signalsymbol = "AllSymbol";
static double lock_eqviti,lock_last, lock_lot;
static bool lock_flag,flagADX,old_uptrend;

//2. Функцию start() переименовываем в start_main() и добавляем над ней:
int start_main(){
double AccountRisk = (AccountBalance()-AccountEquity())/AccountBalance()*100;
if (AccountRisk >Risk) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();lock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}

//3. В функцию init() добавляем

/*init_lock();
return(0);
}
*/
//4. Ниже добавляем:
int init_lock()
{
lock_eqviti=AccountBalance();
lock_lot = 0;
lock_last = Close[0];
flagADX=true;
old_uptrend=false;
signal();
lock_flag = false;
return(0);
}

void start_lock(){
int sig,Step;
if(OrdersTotal()<1){init_lock();return;}
notakeprofit();
if (AccountEquity()>=lock_eqviti){CloseAllFirstProfit();init_lock();
return;
}
else{
sig=signal();
Step =MathAbs(sig);
if (Step<lock_min_step) 
return;
if (Ask>lock_last+(Step*Point) && sig>0 ){
if (lock_lot==0)lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_SELL,-1)/lock_part);
RefreshRates();
if(OrderSend(Symbol(),OP_BUY,lock_lot,Ask,5,0,0,"lock",0,Blue))
lock_last = Ask;
}
if (Bid<lock_last-(Step*Point) && sig<0){
if (lock_lot==0) lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_BUY,-1)/lock_part);
RefreshRates();
if(OrderSend(Symbol(),OP_SELL,lock_lot,Bid,5,0,0,"lock",0,Blue))
lock_last = Bid;
}
}
return;
}

int signal() {
int I, j, result;
double smin, smax, SsMax, SsMin, SSP, price,KanalMin,KanalMax;
SSP = MathCeil(150 / iADX(lock_signalsymbol, PERIOD_M5, 14, PRICE_TYPICAL, MODE_MAIN, 1));
for (j = 120; j >= 0; j--) {
SsMax = iHigh(lock_signalsymbol, PERIOD_M5,j);SsMin = iLow(lock_signalsymbol, PERIOD_M5,j);
for (I = j; I <= j + SSP - 1; I++) {
price = iHigh(lock_signalsymbol, PERIOD_M5,i);
if (SsMax < price)SsMax = price;
price = iLow(lock_signalsymbol, PERIOD_M5,i);if (SsMin >= price)SsMin = price;}
smin = SsMin + (SsMax - SsMin)*0.30;smax = SsMax - (SsMax - SsMin)*0.30;
if (iClose(lock_signalsymbol, PERIOD_M5,j) < smin) {flagADX = false; KanalMin = smin;}
if (iClose(lock_signalsymbol, PERIOD_M5,j) > smax) {flagADX = true; KanalMax=smax;}
result = 0;
if (flagADX != old_uptrend && flagADX == true) result = +1;
if (flagADX != old_uptrend && flagADX == false) result = -1;
old_uptrend = flagADX;
}
if (Digits==5)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point/10,0))*result);
if (Digits==4)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point,0))*result);
 return(0);
 }

void CloseAllFirstProfit() {
int I, k=OrdersTotal();
for (I=k-1; I>=0; I--) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
k=OrdersTotal();
for (I=k-1; i>=0; I--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}

void ClosePosBySelect() 
{
if (OrderType()==OP_BUY) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 100, CLR_NONE))
if (OrderType()==OP_SELL) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 100, CLR_NONE))
return;
}

double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int I,k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (I=0; I<k; I++) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol()==sy || sy=="") if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (op<0 || OrderType()==op) if (mn<0 || OrderMagicNumber()==mn) l+=OrderLots();
return(l);
}

bool notakeprofit(){
bool ok=true;
for (int I=OrdersTotal(); I >=0; I--) if ( OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderTakeProfit()>0){ if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(0,Digits), 0, CLR_NONE))
ok=false;return(ok);
}
return(ok);
}

double NormalizeLot(double lo, bool ro=True, string sy="") {
double l, k;
if (sy=="" || sy=="0") sy=Symbol();
double ls=MarketInfo(sy, MODE_LOTSTEP);
double ml=MarketInfo(sy, MODE_MINLOT);
double mx=MarketInfo(sy, MODE_MAXLOT);
if (ml==0) ml=0.1;
if (mx==0) mx=100;
if (ls>0) k=1/ls; else k=1/ml;
if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;
if (l<ml) l=ml;
if (l>mx) l=mx;
return(l);
}

Хотел спросить мнение экспертов. Я так изменил код и скопировал в советник выше, при компиляции ошибки не выдает. На сколько я правильно всё сделал?

 

Locomotive v1.01 (72).mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

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

Код:

Спойлер

   double   runningprofit;

//--------------------------------------------------------

Comment(

"runningprofit = " + DoubleToString(runningprofit)

);

//--------------------------------------------------------

runningprofit = 0;

  for(int i=OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
             {
              if(OrderType()==OP_BUY)
               {
               runningprofit=OrderProfit()+OrderCommission()+OrderSwap();
               }
               else
              if(OrderType()==OP_SELL)
               {
               runningprofit=OrderProfit()+OrderCommission()+OrderSwap();              
               }                
             }
           }
        }    

В итоге он показывает постоянно ноль (0,000000)

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

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@diodio Приветствую. Вы объявляете переменную с нулем. Потом этот ноль выводите на экран. Последним действием ноль заменяете профитом. С нового цикла все повторяется. Коммент перенеси за цикл. В программировании есть разница в очередности.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
10 часов назад, diodio сказал:

В чем может быть проблемка?

Comment(

"runningprofit = " + DoubleToString(runningprofit)

 

Помести после цикла.
В твоем случае ты объявляешь переменную и сразу выводишь ее значение в Comment/
п.с. зачем в цикле раздельно считаешь профит для БАЙ и СЕЛЛ?
п.п.с. runningprofit = 0;   0 можно присваивать при объявлении переменной. Минус 1 строчка

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, Геннадий_Николаев сказал:

Добрый день, я все попробую обязательно.

Вам в цикле нужно выбирать не просто ордер,  а Последний ордер в сетке, т.е. для Бай ордеров ордер с самой низкой ценой, а для Селл с самой высокой.

Возможно нужно выбирать последний ордер не по цене, а по времени открытия. 2-3 страницы назад такой вопрос обсуждался.

В Вашем же коде выбирается рандомно, скорее всего первый ордер. Соответственно,  условие на открытие второго ордера всегда выполняется

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

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

Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...