Всем привет! Скачал курс и начал изучать. Спасибо огромное за уроки. Очень интересно!
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Подскажите почему не хочет пичатать строку в терминале , вроде нет ошибок.
/| 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);
}
//+-----------------------------------------------------
вот пользуюсь такой стандартной логикой для вычисления лота через процент от риска
все хорошо работает скажем на 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;
}
Так на фунтобаксе залог вдвое больше нужен, вот вам на открытие ордера и не хватает денег.
Просто прямо делите текущие курс фунта на курс кенгуру - и видите насколько больше нужен залог.
К коду бота это не имеет никакого отношение.
А просто перевести сообщение "Not Enough Money" никак не судьба?! :)
Так на фунтобаксе залог вдвое больше нужен, вот вам на открытие ордера и не хватает денег.
Просто прямо делите текущие курс фунта на курс кенгуру - и видите насколько больше нужен залог.
К коду бота это не имеет никакого отношение.
А просто перевести сообщение "Not Enough Money" никак не судьба?! :)
я понимаю что значит эта фраза, вопрос в том почему тот же самый скрипт и логика работает на других парах
да если уменьшить риск все работает
вопрос в том как сделать универсальный скрипт для расчета лота для любой пары
http://ubr.ua/labor-market/education/kursami-syt-ne-budesh-chto-nujno-znat-prejde-chem-zapisatsia-na-it-kursy-340272
Так, для общего понимания темы программирования...
Тоже хочу написать универсальный расчет лота в зависимости от SL, но пока застрял с расчетом стоимости 1 пункта..
Подскажите, как рассчитать стоимость 1 пункта не зная объем лота? В тех формулах, которые я нашел берется зависимость от лота.
Здравствуйте. Подскажите пожалуйста,почему инд. в терминале отображается, а в тестере нет? Пишет: zero divide in 'FOREX INVINCIBLE SIGNAL~.mq4' (290,60) Вроде обычный стрелочник.
MarketInfo(NULL, MODE_LOTSIZE) - Это размер лота для Вашего счёта
MarketInfo(NULL, MODE_TICKVALUE) - это то, что Вам нужно
HighInv размер лота, это не то, что Вы думаете, это размер стандартного лота брокера = 100000 ед.валюты счёта (у норм. брокеров)
MarketInfo(NULL, MODE_LOTSIZE) - Это размер лота для Вашего счёта
MarketInfo(NULL, MODE_TICKVALUE) - это то, что Вам нужно
Да, пока еще не разобрался, много чепухи в голове...
MODE_TICKVALUE - это стоимость 1 пункта в валюте депозита, т.е. заниматься дополнительным переводом, скажем для GPBCAD не нужно?
Здравствуйте!
Друзья, кто знает способы, как можно написать код так, чтоб при убыточном закрытии ордера (любого направления) следующий открывался с увеличенным лотом?
Здравствуйте!
Друзья, кто знает способы, как можно написать код так, чтоб при убыточном закрытии ордера (любого направления) следующий открывался с увеличенным лотом?
Для этого нужно по истории перебрать ордера и найти последний затем вернуть его профит и если профит меньше нуля то вернуть лот
//+------------------------------------------------------------------+
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
Здравствуйте!
Друзья, кто знает способы, как можно написать код так, чтоб при убыточном закрытии ордера (любого направления) следующий открывался с увеличенным лотом?
Для этого нужно по истории перебрать ордера и найти последний затем вернуть его профит и если профит меньше нуля то вернуть лот
//+------------------------------------------------------------------+
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
alex198 там деление на 0, поэтому не запускается. Вот пробуй, эту ошибку исправил, но не факт, что она последняя...
Спасибо большое. Но всё равно не работает. Т.е. на график ставишь-стрелки на прошедших свечах появляются, а на новых нет.
Такой индюк - криво написан. >:d
Спасибо большое. Но всё равно не работает. Т.е. на график ставишь-стрелки на прошедших свечах появляются, а на новых нет.alex198 там деление на 0, поэтому не запускается. Вот пробуй, эту ошибку исправил, но не факт, что она последняя...
Делаю д.з. к 6-му уроку.
Открыл в ручную две позиции:
1. eurusd -> buy
2. audjpy -> sell
Запускаю скрипт, чтобы открыть отложенные ордера. По Евро ничего не срабатывает. По Ауди/ейна открывается стоп, но по цене открытой позиции.
В журнале пусто. Пытался найти ошибку через Print(), но почему-то упорно Print тоже не работает!?
Подскажите, где ошибка?
Делаю д.з. к 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());
}
}
//+------------------------------------------------------------------+
Там Валом ошибок
Спасибо за отклик.
Исправил несколько ошибок: Нормализовал pfo, поставил условие на OrderSend.
Начал думать, как сделать условие на проверку уже установленных отложенных ордеров, т.к. у вас в коде строго прописаны только 2 пары.
Но сначала решил проверить код, т.к. повторно выставлять отложенные ордера не стал бы.
Ничего не изменилось. Опять на Евро ничего не происходит, а Ауди/йена выставляется по цене открытия уже установленного ордера.
В Журнале снова никаких следов Print'а.
Запустил ваш код.
Почему цена отсчитывается от Ask и Bid? Нам же нужно считать от цены открытия ордера?
Зачем открывать два отложенных противоположно направленных ордера?
Сработало только на Евро. В Журнале тоже никаких следов Print'a.
Там Валом ошибок
Спасибо за отклик.
Исправил несколько ошибок: Нормализовал pfo, поставил условие на OrderSend.
Начал думать, как сделать условие на проверку уже установленных отложенных ордеров, т.к. у вас в коде строго прописаны только 2 пары.
Но сначала решил проверить код, т.к. повторно выставлять отложенные ордера не стал бы.
Ничего не изменилось. Опять на Евро ничего не происходит, а Ауди/йена выставляется по цене открытия уже установленного ордера.
В Журнале снова никаких следов Print'а.
Запустил ваш код.
Почему цена отсчитывается от Ask и Bid? Нам же нужно считать от цены открытия ордера?
Зачем открывать два отложенных противоположно направленных ордера?
Сработало только на Евро. В Журнале тоже никаких следов Print'a.
Ну вы же объяснили чего хотите так ведь ? Если объяснили то пожалуйста покажите то что Вы хотите получить в итоге...
Ну вы же объяснили чего хотите так ведь ? Если объяснили то пожалуйста покажите то что Вы хотите получить в итоге...
Не совсем понимаю, как можно показать то, что не получается :)
Как я понял из задания:
Открыты ордера без стопов и тейк-профитов. Скрипт позволяет открыть защитные отложенные ордера (Sell-limit/buy-Stop) на любых парах, где уже открыты ордера без стопов.
Без задания, для себя: Выводить те или иные сообщения в журнал (например, выставлен защитные ордер или произошла ошибка). До этого урока, когда писал советников, в этом не возникало сложности. А вот для скрипта почему-то не получается записывать в журнал :(
Ну вы же объяснили чего хотите так ведь ? Если объяснили то пожалуйста покажите то что Вы хотите получить в итоге...
Не совсем понимаю, как можно показать то, что не получается :)
Как я понял из задания:
Открыты ордера без стопов и тейк-профитов. Скрипт позволяет открыть защитные отложенные ордера (Sell-limit/buy-Stop) на любых парах, где уже открыты ордера без стопов.
Без задания, для себя: Выводить те или иные сообщения в журнал (например, выставлен защитные ордер или произошла ошибка). До этого урока, когда писал советников, в этом не возникало сложности. А вот для скрипта почему-то не получается записывать в журнал :(
А как же вы селлимитами собираетесь защититься ?
ТЗ какое ?
ну есть на франке бай и что мы ему лепить то будем бай стоп ? селл стоп? Бай лимит что ?
А как же вы селлимитами собираетесь защититься ?
ТЗ какое ?
ну есть на франке бай и что мы ему лепить то будем бай стоп ? селл стоп? Бай лимит что ?
Точно!!! Спасибо! Нам на бае Селл-стоп нужен. А у меня Селл-лимит.
Осталось два вопроса:
1. Отложенный ордер открывается на уровне открытия существующего ордера, а нужно чтобы к нему что-то добавлялось/отнималось (в моем коде это pointForOrder).
2. Почему не срабатывает Print?
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем