Я обычно посылаю ордер отдельными функциями. Вот захотелось оптимизировать данный момент, что бы можно было одной функцией посылать и отложки и рыночные ордера.
Подскажите, как это наиболее грамотно реализовать?
Ведь при посыле отложенных ордеров, нужно проверять цену открытия выше(ниже) Аска(Бида) соответственно и ещё некоторые момент учесть.
Заглянуть я как делают другие.. Возьмём самый простой вариант у Кима:
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 21.03.2008 |//| Описание : Открывает позицию и возвращает её тикет. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента (NULL или "" - текущий символ) |//| op - операция |//| ll - лот |//| sl - уровень стоп |//| tp - уровень тейк |//| mn - MagicNumber |//+----------------------------------------------------------------------------+int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
color clOpen;
datetime ot;
double pp, pa, pb;
int dg, err, it, ticket=0;
string lsComm=WindowExpertName()+" "+GetNameTF(Period());
if (sy=="" || sy=="0") sy=Symbol();
if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
Print("OpenPosition(): Остановка работы функции");
break;
}
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
dg=MarketInfo(sy, MODE_DIGITS);
pa=MarketInfo(sy, MODE_ASK);
pb=MarketInfo(sy, MODE_BID);
if (op==OP_BUY) pp=pa; else pp=pb;
pp=NormalizeDouble(pp, dg);
ot=TimeCurrent();
ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
if (ticket>0) {
if (UseSound) PlaySound(NameFileSound); break;
} else {
err=GetLastError();
if (pa==0 && pb==0) Message("Проверьте в Обзоре рынка наличие символа "+sy);
// Вывод сообщения об ошибкеPrint("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
" pp=",pp," sl=",sl," tp=",tp," mn=",mn);
// Блокировка работы советникаif (err==2 || err==64 || err==65 || err==133) {
gbDisabled=True; break;
}
// Длительная паузаif (err==4 || err==131 || err==132) {
Sleep(1000*300); break;
}
if (err==128 || err==142 || err==143) {
Sleep(1000*66.666);
if (ExistPositions(sy, op, mn, ot)) {
if (UseSound) PlaySound(NameFileSound); break;
}
}
if (err==140 || err==148 || err==4110 || err==4111) break;
if (err==141) Sleep(1000*100);
if (err==145) Sleep(1000*17);
if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
if (err!=135) Sleep(1000*7.7);
}
}
return(ticket);
}
Он вообще не проверяет ничего. Видно, что у него функция предназначена только для открытия рыночных ордеров.
По-моему это не логично. Если посылать, то ордер любого типа. Если писать как думаю я, то выйдет слишком длинно, на первый взгляд.
В общем, прошу помощи и наводки, как эти моменты лучше реализовать.
Я обычно посылаю ордер отдельными функциями. Вот захотелось оптимизировать данный момент, что бы можно было одной функцией посылать и отложки и рыночные ордера.
Подскажите, как это наиболее грамотно реализовать?
Ведь при посыле отложенных ордеров, нужно проверять цену открытия выше(ниже) Аска(Бида) соответственно и ещё некоторые момент учесть.
Заглянуть я как делают другие.. Возьмём самый простой вариант у Кима:
Он вообще не проверяет ничего. Видно, что у него функция предназначена только для открытия рыночных ордеров.
По-моему это не логично. Если посылать, то ордер любого типа. Если писать как думаю я, то выйдет слишком длинно, на первый взгляд.
В общем, прошу помощи и наводки, как эти моменты лучше реализовать.
Ну, у Игоря функция выполняет именно ту задачу, которая отражена в имени этой функции. Все настройки и проверки необходимо делать ДО вызова этой функции. Ведь сама функция делает только возложенную на неё задачу - открывает позицию с переданными в неё(в ф-цию) параметрами и не более. Делает она это прекрасно с необходимой обработкой ошибок. Чего не хватает - доработайте сами.
По аналогии: когда покупаете в магазине растворимый кофе, то кипяток и сахар и автоматическое смешивание остальных ингридиентов не предлагается к нему - вам лучше знать как кофе себе приготовить.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Я обычно посылаю ордер отдельными функциями. Вот захотелось оптимизировать данный момент, что бы можно было одной функцией посылать и отложки и рыночные ордера.
Подскажите, как это наиболее грамотно реализовать?
Ведь при посыле отложенных ордеров, нужно проверять цену открытия выше(ниже) Аска(Бида) соответственно и ещё некоторые момент учесть.
Заглянуть я как делают другие.. Возьмём самый простой вариант у Кима:
Он вообще не проверяет ничего. Видно, что у него функция предназначена только для открытия рыночных ордеров.
По-моему это не логично. Если посылать, то ордер любого типа. Если писать как думаю я, то выйдет слишком длинно, на первый взгляд.
В общем, прошу помощи и наводки, как эти моменты лучше реализовать.
Я обычно посылаю ордер отдельными функциями. Вот захотелось оптимизировать данный момент, что бы можно было одной функцией посылать и отложки и рыночные ордера.
Подскажите, как это наиболее грамотно реализовать?
Ведь при посыле отложенных ордеров, нужно проверять цену открытия выше(ниже) Аска(Бида) соответственно и ещё некоторые момент учесть.
Заглянуть я как делают другие.. Возьмём самый простой вариант у Кима:
Он вообще не проверяет ничего. Видно, что у него функция предназначена только для открытия рыночных ордеров.
По-моему это не логично. Если посылать, то ордер любого типа. Если писать как думаю я, то выйдет слишком длинно, на первый взгляд.
В общем, прошу помощи и наводки, как эти моменты лучше реализовать.
Ну, у Игоря функция выполняет именно ту задачу, которая отражена в имени этой функции. Все настройки и проверки необходимо делать ДО вызова этой функции. Ведь сама функция делает только возложенную на неё задачу - открывает позицию с переданными в неё(в ф-цию) параметрами и не более. Делает она это прекрасно с необходимой обработкой ошибок. Чего не хватает - доработайте сами.
По аналогии: когда покупаете в магазине растворимый кофе, то кипяток и сахар и автоматическое смешивание остальных ингридиентов не предлагается к нему - вам лучше знать как кофе себе приготовить.
Народ, можно ли... Пожалуйста переписать под другое условие цикла...
То есть, есть замечательный индикатор bbands_stop:
for (shift=Nbars-Length-1;shift>=0;shift--)
{
smax[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_UPPER,shift);
smin[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_LOWER,shift);
if (Close[shift]>smax[shift+1]) trend=1;
if (Close[shift]<smin[shift+1]) trend=-1;
bsmax[shift]=smax[shift]+0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);
bsmin[shift]=smin[shift]-0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);
if (trend>0)
UpTrendBuffer[shift]=bsmin[shift];
else
DownTrendBuffer[shift]=bsmax[shift];
}
Можно но ли написать тоже код, схожий с результатами предыдущего. Но уже под цикл:
for(i = 0; i <= limit; i++) {
Второй день сижу, не получается придумать...
вСЕМ ПРЮВЕТ вопрос конечно же тупой какой объем лота нужен чтобы 1 пункт стоил 1 доллар
0.1
не всегда
В зависимости от плеча....
0.1 при плече 1:100
В вопросе стимости пункта плечи не имеют значения.