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

От xbms, 13 апреля, 2013 в Уголок Программиста

#4851
axwellweb 1. Есть брокеры и типы счетов которые не принимают в функции OrderSend ровни СЛ и ТП, поэтому надо их устанавливать после открытия ордера.
2. Функция OrderSend возвращает либо номер тикета, либо -1 в случае ошибки открытия, другого не дано. Если номер тикета получен, значит ордер прописан везде и обязан находится и модифицироваться.

Иван В повторяю: если ордер не модифицирован, то это ошибка, она записывается в журнал. Надо открыть журнал, найти код ошибки и посмотреть по справочнику в чём дело. Мы за Вас это не сделаем.
#4852

Уважаемые программисты, вопрос. Висит сетка ордеров длительное время. Как можно модифицировать общий TP учитывая накопившийся своп ? Уже голову сломал. Может это уже где-то обсуждалось - дайте ссылку.

#4853

Свежий урок:
http://tradelikeapro.ru/mql4-strategiya-cherepah/

#4854


Уважаемые программисты, вопрос. Висит сетка ордеров длительное время. Как можно модифицировать общий TP учитывая накопившийся своп ? Уже голову сломал. Может это уже где-то обсуждалось - дайте ссылку.

Своп это деньги. Делите деньги на стоимость пункта получаете пункты для объёма 1 лот. Затем увеличиваете или уменьшаете пропорционально объёму ордеров своей сетки.
Единственная проблема - надо сохранять своп до следующих суток. чтоб вычислить коррекцию именно за текущий день.
#4855

Иван В повторяю: если ордер не модифицирован, то это ошибка, она записывается в журнал. Надо открыть журнал, найти код ошибки и посмотреть по справочнику в чём дело. Мы за Вас это не сделаем.


Добрый день! Вот мой журнал, последняя строчка горит красным, типо ошибка, но код ошибки не пишет, а вечером работает все нормально советник выставляет ордер по нужной цене, а с ним ТП и СЛ. Косяки только днем. Как я понимаю это ошибка из-за сервера альпари, днем даже руками не сразу выставишь.
2017.10.16 11:18:09.084 '1738043': order was opened : #1782315834 sell 1.00 EURUSD at 1.1796 sl: 0.0000 tp: 0.0000
2017.10.16 11:18:09.084 '1738043': modify order #1782315834 sell 1.00 EURUSD at 1.1796 sl: 0.0000 tp: 0.0000 -> sl: 1.2096 tp: 1.1795
2017.10.16 11:18:09.256 '1738043': modification of order #1782315834 sell 1.00 EURUSD at 1.1796 sl: 0.0000 tp: 0.0000 -> sl: 1.2096 tp: 1.1795 failed [Off quotes]
#4856


2017.10.16 11:18:09.256 '1738043': modification of order #1782315834 sell 1.00 EURUSD at 1.1796 sl: 0.0000 tp: 0.0000 -> sl: 1.2096 tp: 1.1795 failed [Off quotes]

Нет цен, попробуйте перед модификацией ордера обновить цены RefreshRates();
#4857

Здравствуйте подскажите как сделать, что бы лот закрывался частично например, половина лота закрылось на расстоянии 200 пунктов от открытия, а остальная часть по пересечению средних. Спасибо.

#4858

Здравствуйте! Подскажите как в MQL4 прописать(посчитать) сумму нескольких убыточных ордеров :-s?

#4859
Roman 13 просто в функцию закрытия ордера вставляете нужный размер лота.

alex202 делаете цикл по ордерам, такой-же как при пересчёте и там добавляете строку:
if ( OrderProfit() как добавить переменную double знаете?
#4860

Спасибо! Но этот вариант не подойдёт он считает последние ордера которые закрылись в одно время , а если ордер открыт и закрыт ранее, он уже не учитывается. Я думаю может есть какой-то вариант через глобальные переменные?


Добавлено: 26-10-2017 09:07:10


Вот такой вариант вы предлагаете или что то др. ?

void BuyOrderLotsMgmall63()
{
double Loss= 0 ; // переменная
double SLBS = iATR(NULL, 0, InpAtrPeriod, 0);
double TPBS = iATR(NULL, 0, InpAtrPeriod, 0);
SLBS *= ATR_MultiplierSL;
TPBS *= ATR_MultiplierTP * TPBSOn;
double profit= 0;
datetime lastCloseTime = 0;
int cnt = OrdersHistoryTotal();
for (int i=0; i {
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && lastCloseTime {
lastCloseTime = OrderCloseTime();
profit = OrderProfit(); // переменная
CurrentBuyLots63 = OrderLots();
}
}

if ((profit >= KFUp)||((profit > KFDn ) && (profit {
CurrentBuyLots63 = CurrentBuyLots63 * KP + 0;
if (true)
CurrentBuyLots63 = lot;
}
else if (profit // убыточные ордера
{
CurrentBuyLots63 = NormalizeDouble(0.01 * OrderProfit() * KF, 2);

Изменено 26 октября, 2017 пользователем alex202

#4861

Работал кто на MQL4 с DynamicBreakoutBox? Дайте, пож, пример кода, где он применяется!

#4862
alex202 я Вам такого предложить не мог :d
в Вашем примере фрагмент функции расчёта лота от последнего закрытого ордера (кстати с ошибкой), а Вы спрашивали про сумму нескольких убыточных ордеров.

Pioner_rus про DynamicBreakoutBox впервые слышу.
#4863

Я примерно имел ввиду, так сказать образ мышления, этот отрывок кода :d . А не подскажете в чём ошибка? :-/

#4864

А не подскажете в чём ошибка? :-/

Ошибочно использование функции OrderProfit() вне цикла перебора ордеров. Вы можете указать какой ордер будет активен после завершения цикла? я вот не смогу и советую найти ордер и сохранить нужные параметры во внешние переменные и потом их использовать.
#4865

Привет , всем , сначала хотел по благодарить Сергея , что сделал видео уроки . Учебник не все могут понять , я среди них . А тут все подробно и с пониманием дела .
Только что начал изучать MQL4 . И сразу на втором уроке нашел ошибку , точнее не до чет : советник находит макс и мин цену на заданном кол-ве баров скажем 10 баров , но проходя дальше , он не изменяет эти величины в этом диапазоне 10 баров , а считает все больше и больше новые экстремумы . Просьба добавить с подробными комментариями нужный код чтобы советник обновлял на каждых 10 барах макс и мин значение . MQL обновился поэтому на всякий случай выкладываю версию второго урока Test2 по новому .

Вот функция которая определяет максимальную цену за заданное кол-во баров(total_candle) :
void GetMaxPrice()
{
//задаем цикл i-бар , перечисляем их от 0 до 10
for(int i=0; i
//находим макс цену
{
mp = iHigh(Symbol() ,PERIOD_CURRENT,i);
if(mp > maxprice)
maxprice = mp;
}
return;
}


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

урок_2_циклы.mq47 скач.

Изменено 29 октября, 2017 пользователем 4er58

#4866

сразу на втором уроке нашел ошибку

Перед вызовом функции GetMaxPrice() нужно обнулить maxprice = 0, для минимума - наоборот сделать максимальным.
#4867

Перед вызовом функции GetMaxPrice() нужно обнулить maxprice = 0, для минимума - наоборот сделать максимальным.



Спасибо , но куда и как правильно вставить не пойму ? У нас в глобальных переменных уже присвоено :
double minprice = 99999, maxprice=-99999 ; Как правильно обнулить записать, не научил Сергей на втором уроке обнулять :)
void OnTick()
{
minprice =0 , maxprice= 0; // Здесь вписываем ?


// Сначала получаем макс и мин цены
GetMaxPrice();
GetMinPrice();

Изменено 29 октября, 2017 пользователем 4er58

#4868

Как правильно обнулить записать, не научил Сергей

Обнулить это значит присвоить значение "0" :)
ВНИМАНИЕ, ещё раз повторяю: минимальное значение обнулять не надо! наоборот сделать его максимальным, т.е. minprice = 99999; (например)
Вставили правильно.
#4869

Обнулить это значит присвоить значение "0"
ВНИМАНИЕ, ещё раз повторяю: минимальное значение обнулять не надо! наоборот сделать его максимальным, т.е. minprice = 99999; (например)
Вставили правильно.


Так не работает алгоритм как надо , значения были присвоены еще на уроке ( максимальные и минимальные значения min и max price ). Посмотрите пожалуйста весь код в первом моем сообщении и поправьте пожалуйста с комментариями, что бы мог разобраться . Тяжело учиться когда и так все туго дается , так еще Сэнсэй не видит и не исправляет недочеты :( . Сергей , ты где ?

Изменено 30 октября, 2017 пользователем 4er58

Автор#4870

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




Тут я! :)
Всё просто, нужно лишь, как уже писали выше, обнулить переменные maxprice, minprice, а лучше присвоить им какие-то экстремальные значения :
maxprice=-99999;
minprice = 99999;

т.е. будет так:

void GetMaxPrice()
{
maxprice=-99999;
//задаем цикл i-бар , перечисляем их от 0 до 10
for(int i=0; i
//находим макс цену
{
mp = iHigh(Symbol() ,PERIOD_CURRENT,i);
if(mp > maxprice)
maxprice = mp;
}
return;
}
// создаем функция мин цены
void GetMinPrice()
{
minprice = 99999;

for(int i=0; i {
mp = iLow(Symbol(),PERIOD_CURRENT,i);//iLow функция нахожд мин цены, (Symbol()-тек график,PERIOD_CURRENT- тек период
if(mp minprice = mp;
}
return;
}
#4871

Тут я!
Всё просто, нужно лишь, как уже писали выше, обнулить переменные maxprice, minprice, а лучше присвоить им какие-то экстремальные значения :
maxprice=-99999;
minprice = 99999;

т.е. будет так:




Ну мы ведь в глобальных переменных уже присваивали им такие значения для сравнения с mp . Значит с глобальных эти переменные можно удалить и вписать не посредственно в функцию и какой толк ? Ни чего не изменилось . На каждом тике функция возвращает новые значения , но только эти значения не уменьшаются когда бары становятся все меньше и меньше и мы смотрим скажем последние 3 бара и видим что макс и мин цены на этих последних трех барах не СУЩУСТВУЕТ ! Как мне еще донести что код надо доработать ?

Изменено 30 октября, 2017 пользователем 4er58

Автор#4872

На каждом тике функция возвращает новые значения , но только эти значения не уменьшаются когда бары становятся все меньше и меньше и мы смотрим скажем последние 3 бара и видим что макс и мин цены на этих последних трех барах не СУЩУСТВУЕТ ! Как мне еще донести что код надо доработать ?



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

Для сравнения можно воспользоваться ещё одним вариантом:

void GetMinPrice()
{
int index = iLowest(NULL, 0, MODE_LOW, 10, 0);
if(index!=-1) minprice = Low[index];
else Print("Ошибка iLowest. Код ошибки = %d" + IntegerToString(GetLastError()));
return;
}
#4873

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

Для сравнения можно воспользоваться ещё одним вариантом:
Код: [Выделить]




Спасибо , кое как разобрался , с новой функцией ,было бы понятнее сразу с комментариями :) .

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

Изменено 31 октября, 2017 пользователем 4er58

Автор#4874

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



Может глюк терминала?
Я перепроверил сейчас на минутках GBPUSD.
Как Low[0], так и High[0] работают без всяких проблем.


void OnTick()
{

Comment(DoubleToStr(High[0]));
}


#4875


Может глюк терминала?
Я перепроверил сейчас на минутках GBPUSD.
Как Low[0], так и High[0] работают без всяких проблем.




Спасибо Шеф , да действительно на другом терминале с новой функцией работает как надо .

Пошел на третий урок )

Изменено 31 октября, 2017 пользователем 4er58

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

Перейти к списку тем
Форум · 2.0.20260627.0025