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

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

#2201

Всем привет! Скачал курс и начал изучать. Спасибо огромное за уроки. Очень интересно!

#2202

Подскажите почему не хочет пичатать строку в терминале , вроде нет ошибок.
/| Expert tick function функции выполняющиеся на каждом тике ДЗ 1 |
//+------------------------------------------------------------------+
int Start ()
{
int x; // обьявляем переменную х так как тип int она имеет целочисленное значение
bool bl; // bool имеет всего 2 значения true = правда false = лож
string ctr = " урок 1"; // string позволяет написать некую информацию строкой

x = 2;


if(x == 0)bl = true;
else bl = false;

if(bl == true)ctr = ctr + " TradeLikeAPro forever...";
else ctr = ctr + " Insta must die!";

Print (ctr);
Comment(ctr);
Alert(ctr);

return(0);
}
//+-----------------------------------------------------

#2203
Dron15 не "пичатает" потому, что тиков нет - выходной сегодня. Перенеси код в OnInit и смотри...
#2204

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

все хорошо работает скажем на AUDUSD, с $770 = 0.6 lot , или EURJPG

но для GBPUSD выдает ошибку "Not Enough Money"

есть идеи почему?


extern double Depo = 0;
extern double RiskPercent = 80;
extern double Lots = 0;
extern int Magic = 113355;
extern int Slippage = 3;
extern double StopLoss = 100;
extern double TakeProfit = 50;

int OnInit()
{
if(Digits==3 || Digits ==5)
{
TakeProfit*=10;
StopLoss*=10;
Slippage *=10;
CandelSize *=10;
}
return(INIT_SUCCEEDED);
}
void OnTick()
{
....
point=MarketInfo(pairs[MaxIndex],MODE_POINT);
dig=MarketInfo(pairs[MaxIndex],MODE_DIGITS);


Lots=GetLots(pair);

//SELL
SL=NormalizeDouble(CurrentPriceAsk+StopLoss*point,dig);
TP=NormalizeDouble(CurrentPriceBid-TakeProfit*point,dig);

OrderSend(pair, OP_SELL, Lots,CurrentPriceBid, Slippage, SL,TP,"Sell",Magic,0,Blue)

//BUY
SL=NormalizeDouble(CurrentPriceBid-StopLoss*point,dig);
TP=NormalizeDouble(CurrentPriceAsk+TakeProfit*point,dig);
OrderSend(pair,OP_BUY, Lots, CurrentPriceAsk,Slippage, SL,TP,"Buy",Magic,0,Green)

}
double GetLots(string pair)
{
double pipValue = MarketInfo(pair,MODE_TICKVALUE);
double lot=0;

if (Depo==0)
Depo=AccountFreeMargin();

lot=NormalizeDouble(Depo*RiskPercent/100.0/StopLoss/pipValue,2);

return lot;
}



#2205

Так на фунтобаксе залог вдвое больше нужен, вот вам на открытие ордера и не хватает денег.
Просто прямо делите текущие курс фунта на курс кенгуру - и видите насколько больше нужен залог.
К коду бота это не имеет никакого отношение.

А просто перевести сообщение "Not Enough Money" никак не судьба?! :)

#2206


Так на фунтобаксе залог вдвое больше нужен, вот вам на открытие ордера и не хватает денег.
Просто прямо делите текущие курс фунта на курс кенгуру - и видите насколько больше нужен залог.
К коду бота это не имеет никакого отношение.

А просто перевести сообщение "Not Enough Money" никак не судьба?! :)



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

вопрос в том как сделать универсальный скрипт для расчета лота для любой пары
#2207

http://ubr.ua/labor-market/education/kursami-syt-ne-budesh-chto-nujno-znat-prejde-chem-zapisatsia-na-it-kursy-340272

Так, для общего понимания темы программирования...

#2208

Тоже хочу написать универсальный расчет лота в зависимости от SL, но пока застрял с расчетом стоимости 1 пункта..

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

#2209

Здравствуйте. Подскажите пожалуйста,почему инд. в терминале отображается, а в тестере нет? Пишет: zero divide in 'FOREX INVINCIBLE SIGNAL~.mq4' (290,60) Вроде обычный стрелочник.

FOREX_INVINCIBLE_SIGNAL~.mq410 скач.

#2210
alex198 там деление на 0, поэтому не запускается. Вот пробуй, эту ошибку исправил, но не факт, что она последняя...

FOREX_INVINCIBLE_SIGNAL-.mq411 скач.

#2211
HighInv размер лота, это не то, что Вы думаете, это размер стандартного лота брокера = 100000 ед.валюты счёта (у норм. брокеров)
MarketInfo(NULL, MODE_LOTSIZE) - Это размер лота для Вашего счёта
MarketInfo(NULL, MODE_TICKVALUE) - это то, что Вам нужно
#2212


HighInv размер лота, это не то, что Вы думаете, это размер стандартного лота брокера = 100000 ед.валюты счёта (у норм. брокеров)
MarketInfo(NULL, MODE_LOTSIZE) - Это размер лота для Вашего счёта
MarketInfo(NULL, MODE_TICKVALUE) - это то, что Вам нужно


Да, пока еще не разобрался, много чепухи в голове...

MODE_TICKVALUE - это стоимость 1 пункта в валюте депозита, т.е. заниматься дополнительным переводом, скажем для GPBCAD не нужно?
#2213

Здравствуйте!
Друзья, кто знает способы, как можно написать код так, чтоб при убыточном закрытии ордера (любого направления) следующий открывался с увеличенным лотом?

#2214


Здравствуйте!
Друзья, кто знает способы, как можно написать код так, чтоб при убыточном закрытии ордера (любого направления) следующий открывался с увеличенным лотом?


Для этого нужно по истории перебрать ордера и найти последний затем вернуть его профит и если профит меньше нуля то вернуть лот

//+------------------------------------------------------------------+

datetime time=0; double profit=0,lots=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if(OrderSymbol()==_Symbol)
if(OrderMagicNumber()==MagicNumber || MagicNumber==-1)
if(OrderCloseTime()>time) // находим последний в истории ордер
{
time=OrderCloseTime(); // запомним время
profit=OrderProfit(); // запомним профит
his_lt=OrderLots(); // запомним лот
}

if(profit lots=his_lt*2; // Увеличим в два раза

//+------------------------------------------------------------------+

Изменено 20 мая, 2015 пользователем voldemar227

#2215
Спойлер



Здравствуйте!
Друзья, кто знает способы, как можно написать код так, чтоб при убыточном закрытии ордера (любого направления) следующий открывался с увеличенным лотом?


Для этого нужно по истории перебрать ордера и найти последний затем вернуть его профит и если профит меньше нуля то вернуть лот

//+------------------------------------------------------------------+

datetime time=0; double profit=0,lots=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if(OrderSymbol()==_Symbol)
if(OrderMagicNumber()==MagicNumber || MagicNumber==-1)
if(OrderCloseTime()>time) // находим последний в истории ордер
{
time=OrderCloseTime(); // запомним время
profit=OrderProfit(); // запомним профит
his_lt=OrderLots(); // запомним лот
}

if(profit lots=his_lt*2; // Увеличим на два

//+------------------------------------------------------------------+


Точно!!!! Спасибо!!! ))))))

Изменено 20 мая, 2015 пользователем Pavel888

#2216


alex198 там деление на 0, поэтому не запускается. Вот пробуй, эту ошибку исправил, но не факт, что она последняя...



Спасибо большое. Но всё равно не работает. Т.е. на график ставишь-стрелки на прошедших свечах появляются, а на новых нет.

#2217


alex198 там деление на 0, поэтому не запускается. Вот пробуй, эту ошибку исправил, но не факт, что она последняя...

Спасибо большое. Но всё равно не работает. Т.е. на график ставишь-стрелки на прошедших свечах появляются, а на новых нет.
Такой индюк - криво написан. >:d
#2218
HighInv Не нужно.
#2219

Делаю д.з. к 6-му уроку.
Открыл в ручную две позиции:
1. eurusd -> buy
2. audjpy -> sell

Запускаю скрипт, чтобы открыть отложенные ордера. По Евро ничего не срабатывает. По Ауди/ейна открывается стоп, но по цене открытой позиции.

В журнале пусто. Пытался найти ошибку через Print(), но почему-то упорно Print тоже не работает!?

Подскажите, где ошибка?

Защитные_отложенные_ордера.mq47 скач.

#2220


Делаю д.з. к 6-му уроку.
Открыл в ручную две позиции:
1. eurusd -> buy
2. audjpy -> sell

Запускаю скрипт, чтобы открыть отложенные ордера. По Евро ничего не срабатывает. По Ауди/ейна открывается стоп, но по цене открытой позиции.

В журнале пусто. Пытался найти ошибку через Print(), но почему-то упорно Print тоже не работает!?

Подскажите, где ошибка?


Там Валом ошибок
//+------------------------------------------------------------------+
//| Защитные отложенные ордера.mq4 |
//| Copyright 2015, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property script_show_inputs
extern int pointForOrder = 500;
extern int Slippage = 5;

extern string Symbol_A="EURUSD";
extern string Symbol_B="AUDJPY";
extern double volume=0.01;
double open,pfo,price=0;
int digits,point;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int b_a=0,s_a=0,b_b=0,s_b=0;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS))
{
if(OrderSymbol()==Symbol_A)
{
if(OrderType()==OP_BUYSTOP) b_a++;
if(OrderType()==OP_SELLLIMIT) s_a++;
}
if(OrderSymbol()==Symbol_B)
{
if(OrderType()==OP_BUYSTOP) b_b++;
if(OrderType()==OP_SELLLIMIT) s_b++;
}
}

double point_a=MarketInfo(Symbol_A,MODE_POINT);
int digits_a=(int)MarketInfo(Symbol_A,MODE_DIGITS);

double point_b=MarketInfo(Symbol_B,MODE_POINT);
int digits_b=(int)MarketInfo(Symbol_B,MODE_DIGITS);

if(b_a==0)
{
pfo=NormalizeDouble(pointForOrder*point_a,digits_a);
price=NormalizeDouble(MarketInfo(Symbol_A,MODE_ASK),digits_a);
open=NormalizeDouble(price+pfo,digits_a);
Comment(price," ",pfo);
if(OrderSend(Symbol_A,OP_BUYSTOP,volume,open,Slippage,0,0)>=0)
Print("Успешно по символу ",Symbol_A);
else
Print("Ошибка по символу ",Symbol_A," ",GetLastError());
}

if(s_a==0)
{
pfo=NormalizeDouble(pointForOrder*point_a,digits_a);
price=NormalizeDouble(MarketInfo(Symbol_A,MODE_BID),digits_a);
open=NormalizeDouble(price+pfo,digits_a);
if(OrderSend(Symbol_A,OP_SELLLIMIT,volume,open,Slippage,0,0)>=0)
Print("Успешно по символу ",Symbol_A);
else
Print("Ошибка по символу ",Symbol_A," ",GetLastError());
}
}
//+------------------------------------------------------------------+
#2221


Там Валом ошибок



Спасибо за отклик.
Исправил несколько ошибок: Нормализовал pfo, поставил условие на OrderSend.
Начал думать, как сделать условие на проверку уже установленных отложенных ордеров, т.к. у вас в коде строго прописаны только 2 пары.
Но сначала решил проверить код, т.к. повторно выставлять отложенные ордера не стал бы.
Ничего не изменилось. Опять на Евро ничего не происходит, а Ауди/йена выставляется по цене открытия уже установленного ордера.
В Журнале снова никаких следов Print'а.

Запустил ваш код.
Почему цена отсчитывается от Ask и Bid? Нам же нужно считать от цены открытия ордера?
Зачем открывать два отложенных противоположно направленных ордера?
Сработало только на Евро. В Журнале тоже никаких следов Print'a.

Защитные_отложенные_ордера.mq47 скач.

#2222



Там Валом ошибок



Спасибо за отклик.
Исправил несколько ошибок: Нормализовал pfo, поставил условие на OrderSend.
Начал думать, как сделать условие на проверку уже установленных отложенных ордеров, т.к. у вас в коде строго прописаны только 2 пары.
Но сначала решил проверить код, т.к. повторно выставлять отложенные ордера не стал бы.
Ничего не изменилось. Опять на Евро ничего не происходит, а Ауди/йена выставляется по цене открытия уже установленного ордера.
В Журнале снова никаких следов Print'а.

Запустил ваш код.
Почему цена отсчитывается от Ask и Bid? Нам же нужно считать от цены открытия ордера?
Зачем открывать два отложенных противоположно направленных ордера?
Сработало только на Евро. В Журнале тоже никаких следов Print'a.

Ну вы же объяснили чего хотите так ведь ? Если объяснили то пожалуйста покажите то что Вы хотите получить в итоге...
#2223



Ну вы же объяснили чего хотите так ведь ? Если объяснили то пожалуйста покажите то что Вы хотите получить в итоге...


Не совсем понимаю, как можно показать то, что не получается :)

Как я понял из задания:
Открыты ордера без стопов и тейк-профитов. Скрипт позволяет открыть защитные отложенные ордера (Sell-limit/buy-Stop) на любых парах, где уже открыты ордера без стопов.

Без задания, для себя: Выводить те или иные сообщения в журнал (например, выставлен защитные ордер или произошла ошибка). До этого урока, когда писал советников, в этом не возникало сложности. А вот для скрипта почему-то не получается записывать в журнал :(
#2224




Ну вы же объяснили чего хотите так ведь ? Если объяснили то пожалуйста покажите то что Вы хотите получить в итоге...


Не совсем понимаю, как можно показать то, что не получается :)

Как я понял из задания:
Открыты ордера без стопов и тейк-профитов. Скрипт позволяет открыть защитные отложенные ордера (Sell-limit/buy-Stop) на любых парах, где уже открыты ордера без стопов.

Без задания, для себя: Выводить те или иные сообщения в журнал (например, выставлен защитные ордер или произошла ошибка). До этого урока, когда писал советников, в этом не возникало сложности. А вот для скрипта почему-то не получается записывать в журнал :(

А как же вы селлимитами собираетесь защититься ?
ТЗ какое ?

ну есть на франке бай и что мы ему лепить то будем бай стоп ? селл стоп? Бай лимит что ?
#2225



А как же вы селлимитами собираетесь защититься ?
ТЗ какое ?

ну есть на франке бай и что мы ему лепить то будем бай стоп ? селл стоп? Бай лимит что ?



Точно!!! Спасибо! Нам на бае Селл-стоп нужен. А у меня Селл-лимит.
Осталось два вопроса:
1. Отложенный ордер открывается на уровне открытия существующего ордера, а нужно чтобы к нему что-то добавлялось/отнималось (в моем коде это pointForOrder).
2. Почему не срабатывает Print?

Защитные_отложенные_ордера.mq48 скач.

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

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