Ну вот я и говорю, сначала одни потом другие, только если по любому после покупок идёт закрытие продаж, то можно их объединить в одну функцию и они пройдут всё равно последовательно. Если иногда будет закрытие наоборот, то можно написать ещё одну зеркальную и вызывать их по условиям.
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Ну вот я и говорю, сначала одни потом другие, только если по любому после покупок идёт закрытие продаж, то можно их объединить в одну функцию и они пройдут всё равно последовательно. Если иногда будет закрытие наоборот, то можно написать ещё одну зеркальную и вызывать их по условиям.
если указать данные функции в последовательности - сначала закрыть бай а потом селл. закрытие будет проходить в такой же последовательности?
Ну вот я и говорю, сначала одни потом другие, только если по любому после покупок идёт закрытие продаж, то можно их объединить в одну функцию и они пройдут всё равно последовательно. Если иногда будет закрытие наоборот, то можно написать ещё одну зеркальную и вызывать их по условиям.
если указать данные функции в последовательности - сначала закрыть бай а потом селл. закрытие будет проходить в такой же последовательности?
Короче догнал что именно пытаетесь спросить, исполнение кода идёт слева на право и сверху вниз, плюс правило скобок как в математике по условиям. Соответственно если будут прописаны две функции подряд без каких либо разграничений, то они так и исполнятся, сначала верхняя, а потом сразу же следующая снизу.
Спойлер
Ну вот я и говорю, сначала одни потом другие, только если по любому после покупок идёт закрытие продаж, то можно их объединить в одну функцию и они пройдут всё равно последовательно. Если иногда будет закрытие наоборот, то можно написать ещё одну зеркальную и вызывать их по условиям.
если указать данные функции в последовательности - сначала закрыть бай а потом селл. закрытие будет проходить в такой же последовательности?
Короче догнал что именно пытаетесь спросить, исполнение кода идёт слева на право и сверху вниз, плюс правило скобок как в математике по условиям. Соответственно если будут прописаны две функции подряд без каких либо разграничений, то они так и исполнятся, сначала верхняя, а потом сразу же следующая снизу.
=d> спасибо.
А подскажите, как сделать выпадающее меню во внешних настройках?
то есть, например, MM = true/false
Читай
А подскажите, как сделать выпадающее меню во внешних настройках?
то есть, например, MM = true/false
tnx :)
Добавлено: 17-11-2014 22:30:48
А правильно ли я понимаю, что вот такая функция
double FindLastLots()
{
double oldlots;
int oldticket;
ticket = 0;
for (int i = OrdersHistoryTotal()-1; i >=0; i--)
{
if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)== true)
{
if( OrderSymbol() == Symbol() && OrderMagicNumber() == Magic )
{
oldticket = OrderTicket();
if( oldticket > ticket)
{
oldlots = OrderLots();
ticket = oldticket;
}
}
}
}
return(oldlots);
}
будет искать лоты только для своего советника?
То есть, если на одном счете два эксперта, эта функция найдет последний лот своего?
Изменено 18 ноября, 2014 пользователем oleguitar
Магики разные (про символ умолчу), значит и ордера разные.
будет искать лоты только для своего советника?
То есть, если на одном счете два эксперта, эта функция найдет последний лот своего?
Вам надо подумать о досрочном выходе из цикла - при тестировании/работе будет зависать (при большой истории закрытых сделок). Досрочный выход, например, если с даты закрытия ордера прошло более месяца...
Можно сохранять лот последнего ордера в переменную (глобальную или статик) и брать его для расчётов нового без всякого поиска по истории, а при открытии нового ордера - переписывать.
Ну у меня эта функция редко вызывается, тестирование нормально проходит, без тормозов
Вот над этим еще думаю:
как бы закрыть ордер, если он старше H часов и его убыток не больше N пунктов, часто ведь бывает, что если сделка затягивается - ничего хорошего может не быть, тем более как у меня , средняя сделка 4 часа, и те, которые старше 1 дня, как правило, убыточные
Нужно наверное сравнить дату закрытия с текущей, только непонятно, с чем сравнивать(if( date_current-date_last)> ??? )
и Найти момент закрытия последней сделки, и записать баланс в стат. переменную, и во время сделки, продолжительностью более 1 дня, сравнивать с балансом текущим, и если он не меньше предыдущего, чем X пунктов или процентов, то закрываем.
Так примерно или проще можно сделать? :-?
Значительно проще.
Так примерно или проще можно сделать? :-?
В той функции, где идёт пересчёт ордеров и вычисляется профит, добавляете пару строк:
if (TimeCurrent() > OrderOpenTime() + 24*3600 && OrderProfit() > -10*OrderLots())
OrderClose(OrderTicket(),OrderLots(),(double)((OrderType()==OP_BUY)?Bid;Ask),Slippage,Gray);
24 - это кол-во часов, мин.профит (-10) нужно вычислять от размера лота, но можешь сделать по своему.
Если возникнут вопросы по (double)((OrderType()==OP_BUY)?Bid;Ask) - читай справку, или сам вычисляй цену закрытия.
1) -10 - в пунктах, как я понимаю?
2)А если вот так?
if (TimeCurrent() > OrderOpenTime() + 24*3600 && OrderProfit() > -10*OrderLots()) CloseBuy();
void CloseBuy()
{
for (int i = OrdersTotal()-1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (!(OrderSymbol() == Symbol() && (OrderMagicNumber() == Magic))) continue;
if (OrderType() == OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Red);
}
}
1. Только если у Вас OrderProfit() выдаёт значение в пунктах... У меня в валюте депозита.
1) -10 - в пунктах, как я понимаю?
2)А если вот так?
2. Отлично.
Доброго всем времени суток!
Подскажите пожалуйста с таким вопросом: при открытие ордера получаю ошибку ordersend error 130.
Ордер открываю по цене как на скриншоте 1.24629.
double bl = Ask+200*Point;
double sl = Ask-200*Point;
double tp = Ask+400*Point;
bool resultBUYLIMIT = OrderSend(Symbol(), OP_BUYLIMIT, 0.01, bl, 1, sl, tp);
В чём может быть проблема?
Пример:
double bl = NormalizeDouble(Ask + 200 * Point, Digits);
и что-то у вас маловато проскальзывание, да и вообще не хватает параметров в OrderSend.
У некоторых брокеров стоплэвел великоват (напр Ф4Ю), нужна проверка. Можно так:
Подскажите пожалуйста с таким вопросом: при открытие ордера получаю ошибку ordersend error 130.
В чём может быть проблема?
double Dist = MathMax(200, MarketInfo(_Symbol,MODE_STOPLEVEL));
double bl = NormalizeDouble(Ask+Dist *Point, Digits);
Bal, попробуйте нормализовать значения для использования в функции.
Пример:
double bl = NormalizeDouble(Ask + 200 * Point, Digits);
и что-то у вас маловато проскальзывание, да и вообще не хватает параметров в OrderSend.
Попробовал NormalizeDouble, но без результатов. Проблема в том, что это уже второй мой советник и в первом советнике такой код прекрасно работает даже с меньшим стопам / тейкам. Поэтому эта ситуация меня немного в ступор загнала. Специально даже такой простой код написал для наглядности.
У некоторых брокеров стоплэвел великоват (напр Ф4Ю), нужна проверка. Можно так:
double Dist = MathMax(200, MarketInfo(_Symbol,MODE_STOPLEVEL));
double bl = NormalizeDouble(Ask+Dist *Point, Digits);
MarketInfo(Symbol(),MODE_STOPLEVEL)) возвращает 0.
Ps. брокер пантеон финанс
Давайте тогда весь код посмотреть и прогнать в тестере, так будет понятнее.
В советнике строчка 160, я написал при каких условиях выполнится и как запустить.
Для запуска нужен индикатор fractal_dimension
Да, действительно. Благодарю за помощь! :)
Попытка наложить болинжер на индюк накопления распределения не увенчалась успехом
double AD[];
int dim=10000;
ArrayResize(AD,dim);
for(int bar=0; bar ArraySetAsSeries(AD,true);
double AD_LOWER = iBandsOnArray(AD,dim,24,2,0,2,0);
double AD_UPPER = iBandsOnArray(AD,dim,24,2,0,1,0);
double AD_MAIN = iBandsOnArray(AD,dim,24,2,0,0,0);
AD_LOWER, AD_UPPER, AD_MAIN выдают значения, которые не имеют никакого отношения к болинжеру, наложенному на AD.
Помогите, пожалуйста, решить проблему.
Добавлено: 22-11-2014 07:35:18
Нашел ответ, надо было вот так:
double AD[];
int dim=10000;
ArrayResize(AD,dim);
ArraySetAsSeries(AD,true);
for(int bar=0; bar double AD_LOWER = iBandsOnArray(AD,dim,24,2,0,2,0);
double AD_UPPER = iBandsOnArray(AD,dim,24,2,0,1,0);
double AD_MAIN = iBandsOnArray(AD,dim,24,2,0,0,0);
Изменено 22 ноября, 2014 пользователем ArmStrong
вот ошибки
2014.11.23 22:37:51.879 2014.09.01 17:00 unresolved import function call
2014.11.23 22:37:51.879 2014.09.01 17:00 Cannot find 'tral' in 'library.ex4'
импорт длл разрешен..
что делать в чем причина?
Сова не находит библиотеку 'library.ex4'. У Вас она есть? Если есть, то должна находиться в папке MQL4\Libraries.
Найти эту папку можно через Ваш_терминал/Файл/Открыть каталог данных
Ребята доброго времени.
бьюсь во с какой бедой. работа советника происходит от одного индикатора как открытие ордеров,так и их закрытие. то есть если кто знаком с системой кукловод то вы должны понять что к чему.в общем так условия закрытия таковы
[
if( indi_usd >= 70) Close_Orders_USD();
else
if( indi_usd
if( indi_usd else
if( indi_usd >= 10) Close_Orders_USD();
]
В общем пробовал писать условие разным вариантом,все равно работает не правильно.то есть там как я понимаю нужно установить флаг,я попросту не знаю как это сделать.заранее благодарен кто откликнется.
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем