Вопросы от новичка.
Какой смысл в параметре Slippage в отложенных ордерах?
В чем отличие его работы от рыночных ордеров?
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
И ещё, уже долго до меня не дойдёт, как сделать так чтобы открывался только один ордер при заданном условии и при закрытии по тейку не открывался ещё один, так как условие всё ещё соблюдено. То есть, на примере советника, если цена выше скользящей средней - открывается ордер на покупку и закрывается по тейку, ну или стопу, а следующий ордер должен быть только на продажу, и не важно закрылся он по SL || TP.
Просмотрев уроки учителя, открыв MetaEditor, написал (напечатал), НО, во-первых ордера на покупку открываются ниже мувинга
при условии Ask>MA, ну и во-вторых за ордером BUY и последующим его закрытием открывается BUY.
Кому не сложно посмотрите, укажите на ошибки.
СпойлерИ ещё, уже долго до меня не дойдёт, как сделать так чтобы открывался только один ордер при заданном условии и при закрытии по тейку не открывался ещё один, так как условие всё ещё соблюдено. То есть, на примере советника, если цена выше скользящей средней - открывается ордер на покупку и закрывается по тейку, ну или стопу, а следующий ордер должен быть только на продажу, и не важно закрылся он по SL || TP.
Просмотрев уроки учителя, открыв MetaEditor, написал (напечатал), НО, во-первых ордера на покупку открываются ниже мувинга
при условии Ask>MA, ну и во-вторых за ордером BUY и последующим его закрытием открывается BUY.
Кому не сложно посмотрите, укажите на ошибки.
Для начала:
int MA = iMA(Symbol(),0,200,0,MODE_EMA,PRICE_CLOSE,0);
Переменная MA, должна быть объявлена как double. Ваша МА, в лучшем случае, выдаёт 1. Также, я бы написал Bid>MA, вместо Ask>MA (но это неприципиально). Не лепите скобки на один уровень, сделайте как у xbms - ступеньками. Похоже sell советник не открывает - не на месте закрывающая скобка... . Slippage, на рыночных, не ставьте 0.
Команда start срабатывает на каждом тике. Исходя из этого и печатать надо: => если ордеров нет => если последний ордер был Бай, значит ждём сигнал на Селл => если последний был Селл, значит ждём сигнал на Бай...
Rusand
Нет смысла. Пишите 0.
ни чё у меня не получается...
Vorchunozavr, покажите мне как это в коде надо записать
ни чё у меня не получается...
Vorchunozavr, покажите мне как это в коде надо записать
Столько раз в уроках пережевано было: и пересчет ордеров, и нужные параметры в них.
При пересчете от конца находишь нужный ордер, сравниваешь время открытия со временем настоящим. Если разные, то возвращаешь true, как сигнал к торговле.
Добавлено: 19-12-2013 17:32:51
Мне кто нибудь поможет сделать то, что я каждыми днями пытаюсь сделать?
То что удалось сделать, так это изменить немного функцию выборки закрытых ордеров, добавил переменную oldticket которая сравнивается с последним тикетом, и забирает у последнего ордера тип, и переменной type присвоил значение OrderType()+1, что бы переменная была или 1 или 2 в зависимости от типа закрытого ордера. Добавил в условия и чуда не произошло, но уже более менее похоже на истину. Скажите что ж надо ещё туда вписать, чтобы всё заработало?
Изменено 19 декабря, 2013 пользователем Сast
Мне кто нибудь поможет сделать то, что я каждыми днями пытаюсь сделать?
Уж и помогать особо нечего...
Просто МА считается, только если if (Count() == 0 && order_type == 0), считать нужно или вне условий, или после каждого. Я, почему ступеньками советовал - так виднее... ;).
Ещё, при отсутствии стопа, ордер может висеть долго.
Переменная ticket, объявлена на глобальном уровне, в функции лучше её не использовать.
Доброго времени вам господа программисты. всех С Новым 2014 Годом.
В общем интересует что б кто то посмотрел код. А то сомнение берет правильно ли я написал без убыток и трелинг в нем. Задумка была токова,когда по мартину открываются доливочные ордера,то вычисляем общий без убыток,ставим стоп лосс и потом тралим.
samuliak ,Я то же не специалист,только учусь,но внимательно посмотри видео уроки,постарайся вникнуть хоть не много.Там в первом уроке есть такая фишка как можно использовать за место калькулятора.еще на сайте MQL4 там написанно что такое константы ,переменные и все такое,что к чему присваевается. Я по началу то же тупо списал.
Посмотри код сравни со своим,должен понять где ошибки.
У вас немного другая сова, я когда то так же её писал. А меня интересует что именно в моей неправильно. И никак не могу найти ошибку.(
Скажу словами господина xbms Очень настоятельно рекомендую просмотреть вводные видео уроки.иначе совсем не чего не поймете.
xbms, посмотрите пожалуйста функции на наличие ошибок ( они там похоже точно есть)
суть первой функции в поиске лота, который необходим для покрытия убытка за TP пунктов в случае закрытия сетки ордеров.
вторая функция должна закрывать половину сетки начиная с самого старшего ордера
double FindRightLot (int otype) // функция поиска лота, необходимого для выхода из просадки после
//закрытия сетки ордеров
{
double Lot=0; double TotalLot=0;
for (int i = OrdersTotal()-1; i>0; i--)
{
if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == otype)
{
if (otype == OP_BUY)
{
Lot = NormalizeDouble ((OrderOpenPrice()-Bid)*OrderLots()/TP,2);
if (Lot>0)
{
TotalLot= NormalizeDouble (TotalLot+Lot,2);
}
}
else if (otype == OP_SELL)
{
Lot = NormalizeDouble ((Ask-OrderOpenPrice())*OrderLots()/TP,2);
if (Lot>0)
{
TotalLot= NormalizeDouble (TotalLot+Lot,2);
}
}
}
}
}
return (TotalLot);
}
//+------------------------------------------------------------------+
void CloseHalfOrders (int otype)// ф-ция закрытия половины ордеров сетки
{
int count = 0;
for (int i = 0; i {
if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == otype)
{
if (otype == OP_BUY)
{
if (count3 )
OrderClose(OrderTicket(),OrderLots(),Bid,0,Black);
count++;
}
else if (otype == OP_SELL)
{
if (count3)
OrderClose(OrderTicket(),OrderLots(),Ask,0,Black);
count++;
}
}
}
}
}
Доброго времени вам господа программисты. всех С Новым 2014 Годом.
В общем интересует что б кто то посмотрел код. А то сомнение берет правильно ли я написал без убыток и трелинг в нем. Задумка была токова,когда по мартину открываются доливочные ордера,то вычисляем общий без убыток,ставим стоп лосс и потом тралим.
Привет всем,что не кто не подскажет по поводу моей просьбы ?
Здравствуйте всем! С Новым 2014 годом вас! У меня вопрос возник. Дело в том. что после загрузки и установки не открывается видеоролик ("MQL4 Программирование" курс молодого бойца" и др). Выдает сообщение "Нет приложения, связанного с данным расширением файла". Подскажите, пожалуйста, что это означает и что мне следует предпринять для устранения этой проблемы. Заранее спасибо!
Изменено 6 января, 2014 пользователем Nart60
Сорри за нубский вопрос, но что-то я не разобрался, а с одного чарта нельзя в эксперте открывать явно ордера по другим инструментам?
Т.е. если я запускаю сову на EURUSD, а в коде написано:
OrderSend("USDJPY", OP_SELL, ....ну и так далее), то... ничего не происходит. В логе тоже пусто.
UPD: Разобрался сам: нужно было в качестве параметра цены передавать MarketInfo по инструменту.
Изменено 10 января, 2014 пользователем JR
Люди добрые подскажите: мне нужно определить профит последнего закрытого ордера и его тип,а так же последний лот .Накидал вот такие функции но,что не работает
double CountProfitHystory()
{
int profit = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==false) { Print("Error in history!"); break; }
if(OrderSymbol() != Symbol() && OrderMagicNumber() != Magic)continue;
profit=OrderProfit();
}
return(profit);
}
2) int FindLastOrderType()
{
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}
3) double FindLastLots(int otype)
{
double oldLots;
int oldticket;
ticket = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
oldLots = OrderLots();
ticket = oldticket;
}
}
}
}
return(oldLots);
}
Добавлено: 12-01-2014 10:15:23
Спасибо товарищи за помощь,она была неоценимой :d
Выкладываю исправленную версию,авось кому пригодится \M/
int CountProfitHystory()
{
double profit = 0;
int i,accTotal=OrdersHistoryTotal();
for( i=0;i {
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true)
{if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
profit=OrderProfit();
}
}
return(profit);
}
2) //+------------------------------------------------------------------+
double FindLastLots(int otype)
{
double oldLots;
int oldticket;
ticket = 0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
oldLots = OrderLots();
ticket = oldticket;
}
}
}
}
return(oldLots);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for(int i = OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}
Изменено 12 января, 2014 пользователем AndreyP
к уроку - Пишем советник на мартингейле
Сразу извиняюсь если эта тема уже освещалась (не нашел).
Писал советник под-диктовку с урока, но вылазит куча ошибок.
Сразу отвечу, что предварительные уроки смотрел.
Прошел несколько раз по коду параллельно с прокруткой видео ...
Возможно сказывается полное отсутствие опыта программирования.
(Почему то, мне нельзя засунуть текст кода ни в поле КОДА, ни в поле СПОЙЛЕРА. Так, что извиняюсь...)
Привожу код, который писал под-диктовку:
=================================================================================
extern double Lots = 0.1;
extern int TakeProfit = 50;
extern int Step = 50;
extern double Multiplier = 2;
extern int Slippage = 5;
extern int Magic = 333;
int ticket;
double price, TP, lastlot;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
Step *= 10;
Slippage *= 10;
}
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if (CountTrades() == 0)
{
double ima = iMA(Symbol(), PERIOD_H1, 14, 0, MODE_SMA, PRICE_CLOSE, 1);
if (Ask > ima)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Green);
if (ticket > 0)
{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
}
}
else if(Bid {
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red);
if (ticket > 0)
{
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
}
}
}
else
{
int order_type = FindLastOrderType();
{
if (order_type == OP_BUY)
{
price = FindLastPrice(OP_BUY);
if(Ask {
lastlot = FindLaslLots(OP_BUY);
lastlot = NormalizeDouble(lastlot * Multiplier, 2);
ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, Slippage, 0, 0, "", 0, Green);
if (ticket > 0)
ModifyOrders(OP_BUY);
}
}
else if (order_type == OP_SELL)
{
price = FindLastPrice(OP_SELL);
if(Bid {
lastlot = FindLaslLots(OP_SELL);
lastlot = NormalizeDouble(lastlot * Multiplier, 2);
ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, Slippage, 0, 0, "", 0, Red);
if (ticket > 0)
ModifyOrders(OP_SELL);
}
}
}
return(0);
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
double avgprice = 0, order_lots = 0;
price = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
price += OrderOpenPrice()*OrderLots();
order_lots += OrderLots();
}
}
}
avgprice = NormalizeDouble(price / order_lots, Digits);
if (otype == OP_BUY) TP = NormalizeDouble(avgprice + TakeProfit*Point, Digits);
if (otype == OP_SELL) TP = NormalizeDouble(avgprice - TakeProfit*Point, Digits);
for (i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0);
}
}
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
double oldlots;
int oldticket;
ticket = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldlots = OrderLots();
ticket = oldticket;
}
}
}
}
return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastPrice(int otype)
{
double oldopenprice;
int oldticket;
ticket = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldopenprice = OrderOpenPrice();
ticket = oldticket;
}
}
}
}
return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}
//+------------------------------------------------------------------+
int CountTrades()
{
int count = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
count ++;
}
}
return(count);
}
=====================================================================
Пожалуйста, помогите.
Изменено 12 января, 2014 пользователем Nafanja
А вот более серьезная ошибка в этом уроке, которая изначально в видео есть - неправильная проверка для доливки при SELL ордерах. Изначально в уроке так:
if(Bid if (Bid >= price + Step * Point).
Без этого мартышка правильно работать не будет.
Изначально в уроке так:
if(Bid if (Bid >= price + Step * Point).
Без этого мартышка правильно работать не будет.
Спасибо за подсказку.
А на счет синтаксиса - проверял раза четыре.
Если конечно это не СПЕЦИАЛЬНО созданная ошибка.
Потому как я пока в этом ...
Ладно, буду рыть дальше
http://forum.mql4.com/ru/60074
Ну вот, и случился бескровный переход на язык mql5.
Подскажите плз, каким образом лучше ограничивать бота на открытие ордеров во время быстрых движений (новости и связанные с ними каки исполнения)? Проверять размер текущей свечи?
Добрый день.
Прошу подсказать следующую информацию:
1. На каком минимальном расстоянии от Ask можно открывать ордер Buystop? Как это можно узнать программно?
Я пытаюсь узнать с помощью MarketInfo(Symbol(), MODE_STOPLEVEL).
Но, во-первых, значение возвращается 0, а во-вторых, я не уверен, что это именно то, про что я спрашиваю.
2. Как можно сделать паузу в выполнении операции до следующего тика?
Спасибо.
Вызывается через MarketInfo(Symbol(), MODE_FREEZELEVEL).
2. Не корректный вопрос. После завершения функции start() программа автоматически ожидает следующий тик.
Если нужно сделать внутри функции start(), то используется функция RefreshRates().
Здравствуйте уважаемые! Вот у меня такая вот "беда".Написал функцию подсчета максимальной просадки,но она не сохраняет значение,после закрытия ордера обнуляется почему то :d .Дак вот вопрос как сделать чтоб она все же хранила эту переменную?
double MaxDrawn()
{ double DrMax;
double Dr=NormalizeDouble((AccountProfit()/AccountBalance())*100,2);
if (DrMax
DrMax=Dr;
return(DrMax);
}
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем