Вопросы по программированию в МТ4

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 03 окт 2016, 12:36

MagistrSanich писал(а):
Рэндом писал(а):Надо писать о баге в службу поддержки Метаквотес.

Но у тебя же тоже OrderTicket ноль возвращает, я так понял мой код у тебя точно так же работает

Да, так же.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Вопросы по программированию в МТ4

Сообщение mfcoder » 03 окт 2016, 20:42

Рэндом писал(а):for(int i=0;i<(OrdersTotal()+1);i++)


это что за бред с +1 ?
я уже год ничего не писал, и может чего-то уже сурово изменилось с тех пор..
Аватар пользователя
mfcoder
 
Сообщений: 1531
Зарегистрирован: 29 июл 2013, 11:55
Средств на руках: 26.85 Доллар
Группа: Базовая
Благодарил (а): 78 раз.
Поблагодарили: 423 раз.

Вопросы по программированию в МТ4

Сообщение Kalkin » 03 окт 2016, 21:58

В коде есть одна недопустимая логическая ошибка. В цикле перебора и модификации ордеров после вызова OrderSelect(...) идет обращение к функции counter(...), которая в свою очередь также содержит перебор ордеров и вызов OrderSelect(...). Получается, что при попытке модификации для функции OrderModify() передается тикет и цена открытия не очередного ордера, как задумывалось, а совсем другого, на котором заканчивает работу функция counter(). Код надо переписывать.

mfcoder писал(а):
Рэндом писал(а):for(int i=0;i<(OrdersTotal()+1);i++)


это что за бред с +1 ?
я уже год ничего не писал, и может чего-то уже сурово изменилось с тех пор..

Да, и +1 в counter(), конечно же, надо убрать.
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 04 окт 2016, 04:07

Да, вызов ордер селект в каунт может все нарушить.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 04 окт 2016, 05:40

Вот рабочий вариант. Но в логике советника есть ошибки.
Код: выделить все
#property copyright "MagistrSanich"
#property link "https://www.mql5.com"
#property version "1.00"
#property strict

input double Lots=0.01;
input int Slip=30;
input int Magic=10;
input int TakeProfit=300;
input int StopLoss=300;

int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int counter(int type)// ФУНЦИЯ ПОДСЧЕТА ОРДЕРА, РАБОТАЕТ ПРАВИЛЬНО
{
int n=0;
for(int i=0;i<(OrdersTotal());i++)
if(OrderSelect(i,SELECT_BY_POS)==true)
if(OrderMagicNumber()==Magic)
if(OrderType()==type)
n++;
return n;
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
int mod=-18;
void OnTick()
{
if(counter(OP_BUY)==0) mod=-199;
if(counter(OP_BUY)==0)//counter()-функция которая считает ордера
OrderSend(_Symbol,OP_BUY,Lots,Ask,Slip,0,Ask+TakeProfit*Point,"",Magic,0,clrBlue);//Устанавливается TakeProfit и StopLoss, который работает правильно
if(counter(OP_SELL)==5)
OrderSend(_Symbol,OP_SELL,Lots,Bid,Slip,0,0,"",Magic,0,clrRed);

int Namber=500;//Namber - это TP и SL
double tpB=NormalizeDouble((Namber*Point+Ask),Digits);
double tpS=NormalizeDouble((Bid-Namber*Point),Digits);

for(int i=0;i<OrdersTotal();i++)//Цикл перебораа ордеров
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if(OrderMagicNumber()==Magic)
//if(counter(OP_BUY)==1 || counter(OP_SELL)==1)
{
Print(tpS," ",tpB," ",OrderTicket());
if(OrderType()==OP_BUY && counter(OP_BUY)==1)//Модификация BUY
mod=OrderModify(OrderTicket(),Ask,tpS,tpB,0);
//После выполнения функции присваивает 1 если получилось и 0 если нет
if(OrderType()==OP_SELL && counter(OP_SELL)==1)//Модификация SELL
OrderModify(OrderTicket(),Bid,tpB,tpS,0);
}
}

Comment("mod= ",mod,"\nBUY: ",counter(OP_BUY),"\nSELL: ",counter(OP_SELL));

}
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Re: Вопросы по программированию в МТ4

Сообщение Haos » 04 окт 2016, 08:05

Правильному стилю программирования нужно учиться. Тогда и ошибок не будет. У нас на форуме уже достаточно статей обучающих.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Вопросы по программированию в МТ4

Сообщение MagistrSanich » 04 окт 2016, 09:30

Поставил фигурные скобки и все получилось, большое спасибо, рандому, что помог и Калкину тоже
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{...Тут OrderModify и прочее.}
Аватар пользователя
MagistrSanich
 
Сообщений: 10
Зарегистрирован: 29 сен 2016, 16:04
Средств на руках: 5.00 Доллар
Группа: Новые пользователи
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 04 окт 2016, 09:35

Пожалуйста.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Вопросы по программированию в МТ4

Сообщение Alexandeer » 04 ноя 2016, 05:23

Здравствуйте, я не так давно начал программировать на MQL4 и я не смог найти решения для пары проблем:
1) Когда пишешь
input int StopLoss = 150;
То соответственно, когда пользователь хочет сам задать значение советнику, то ему отображается на английском "StopLoss".
Вопрос: как сделать на русском?
2) Когда тестишь советники открывается по умолчанию окно визуализации, со следующими настройками:
сетка, не красивые одноцветные бары. Короче как задать настройки для графика таким образом, что бы каждый раз при открытии графика они сохранялись?
Уверен, что на такие вопросы уже тысячу раз отвечено, но я честно не смог найти, я на форме искал и гуглил.
Аватар пользователя
Alexandeer
 
Сообщений: 17
Зарегистрирован: 04 ноя 2016, 04:54
Средств на руках: 8.00 Доллар
Группа: Новые пользователи
Благодарил (а): 18 раз.
Поблагодарили: 0 раз.

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 04 ноя 2016, 05:30

input int StopLoss = 150;//Стоп лосс
Для того чтобы отображалось русское название надо просто добавить комментарий.
Второе. Настраиваете график. Кликнуть правой кнопкой мыши на графике. Далее шаблоны, сохранить шаблон. Потом в разделе шаблоны его можно выбрать.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 141

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron