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

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

#2351

Помогите написать сигнал с двух индикаторов,FORCE и CCi,как это сделать через цикл?или как то по другому?
Условие,если FORCE находится внутри канала ( Force > -FORCE_level && Force if(CCiпосле и больше 55 баров так же смотрим на CCi
if(CCI > CCI_level)return(OP_SELL);

#2352

Через цикл или просто на каждом баре отслеживаете вход/выход индюка из канала и сохраняете время события.

#2353


Через цикл или просто на каждом баре отслеживаете вход/выход индюка из канала и сохраняете время события.


А как ч через цикл?как именно? Если можно на примере,спасибо
#2354



Через цикл или просто на каждом баре отслеживаете вход/выход индюка из канала и сохраняете время события.

А как ч через цикл?как именно? Если можно на примере,спасибо
Примерно так:
int i;
double Force;
for (i = 1; i {
Force = iForce(NULL,0,iPeriod,MODE_SMA,PRICE_CLOSE, i);
if (Force FORCE_level) break;
}
if (i >= BarCnt) //Условие выполнено - проверяем ССИ и вход
{

}
#2355



Здравстуйте! От ошибки "OrderSend error 130" все равно не получается избавится! Появляется при долгосрочном тестировании иногда, ордера отложенные, стоп-лос и тейк профит навны 0. Кто знает от чего это может быть????

После вызова ОрдерСэнд проверяете магик если


При проверке магика ни чего не происходит. Наверно, вы имели ввиду проверить тикет ордера, а не магик: если тикет
1) 2015.07.06 15:07:56.576 2015.05.06 05:55 Tester: order #3, buy 0.02 EURUSD is opened at 1.12061
2) 2015.07.06 15:07:56.576 2015.05.06 05:55 EURUSD,M15: OrderSend error 130
3) 2015.07.06 15:07:56.576 2015.05.06 05:55 EURUSD,M15: OOP: 1.11761 max_gr_1: 1.12061 Lot: 0.01 Type: 1.

Причем по отложенному ордеру бай-стоп открылся ордер бай, а в журнале (в этом сообщении, при условии если тикет
Не могу понять из-за чего так происходит???
#2356
Sany2912, да Вы выложите целиком посмотреть что там на ваяли, а то предлагаете угадать картину целиком по кусочку пазла :-?.
#2357

Не могу понять из-за чего так происходит???

Чего-ж тут непонятного? Всё просто:
Бай открылся и в тут-же попытка открыть рыночный Селл (Type: 1) , а т.к. цена ордера не соответствует текущей цене - выдаёт ошибку. Ищите почему у Вас открывается рыночный Селл.
#2358


Не могу понять из-за чего так происходит???

Чего-ж тут непонятного? Всё просто:
Бай открылся и в тут-же попытка открыть рыночный Селл (Type: 1) , а т.к. цена ордера не соответствует текущей цене - выдаёт ошибку. Ищите почему у Вас открывается рыночный Селл.


Нет, не рыночный, а выставляется отложенный селл-стоп, по другому уровню и с ним проблем нет! Проблема иногда появляется, когда срабатывает бай-стоп и открывается ордер бай...
#2359



Не могу понять из-за чего так происходит???

Чего-ж тут непонятного? Всё просто:
Бай открылся и в тут-же попытка открыть рыночный Селл (Type: 1) , а т.к. цена ордера не соответствует текущей цене - выдаёт ошибку. Ищите почему у Вас открывается рыночный Селл.
Нет, не рыночный, а выставляется отложенный селл-стоп, по другому уровню и с ним проблем нет! Проблема иногда появляется, когда срабатывает бай-стоп и открывается ордер бай...
Я ничего не знаю про Селл-Стоп, я вижу в журнале "Type: 1" - это обычный Селл или Вы что-то другое в журнал выводите?
#2360




Через цикл или просто на каждом баре отслеживаете вход/выход индюка из канала и сохраняете время события.

А как ч через цикл?как именно? Если можно на примере,спасибо
Примерно так:
int i;
double Force;
for (i = 1; i {
Force = iForce(NULL,0,iPeriod,MODE_SMA,PRICE_CLOSE, i);
if (Force FORCE_level) break;
}
if (i >= BarCnt) //Условие выполнено - проверяем ССИ и вход
{

}

Спасибо за помощь Oll!!!

Изменено 6 июля, 2015 пользователем Старик

#2361

Oll не получается у меня получить прибыльность 5 , 3.7 максимально , а мартин чистый ставить не хочу, кое что переделал и просадка уже больше 30 % пошла. Как вынести флаги на true или folse не разбирусь? В коде как написать.

SNAG-15070719060100.png

#2362

Как вынести флаги на true или folse не разбирусь? В коде как написать.

Что значит "вынести"? Флаг это булева переменная:
bool flag;
flag = true; - может это?
#2363


Как вынести флаги на true или folse не разбирусь? В коде как написать.

Что значит "вынести"? Флаг это булева переменная:
bool flag;
flag = true; - может это?


Все мучею запрет на работу советника в разные стороны бай и сел , хочу в настройки вынести true . Не получается сделать запрет в коде , не пойму куда вставить и как правильно записать.
#2364

Все мучею запрет на работу советника в разные стороны бай и сел , хочу в настройки вынести true . Не получается сделать запрет в коде , не пойму куда вставить и как правильно записать.

Так-бы сразу и написал:
enum DIRenum { Авто=-1, Бай=0, Селл=1 }; // это сверху во внешних параметрах
input DIRenum Направление_входа = Авто;

if (Направление_входа == Авто) // здесь определяешь направление, если режим - авто
{

}
else // здесь просто входишь по заданному в Направление_входа направлению
{

}
#2365

Добрый день, коллеги трейдеры.
Имеется проблема в работе скрипта. Скрипт простейший - открывает ордер. Проблема в том, что никак не дается рассчет стоп-лосса и тейк профита. Задаю эти параметры в команде - вылетает ошибка, хотя они вроде бы корректные. Пробую задать фиксированные - то же ошибка. В общем, непонятно.
Вот код:
void OnStart()
{
string Symb=Symbol();
string type="OP_SELL";
double lot1=0.01;
int start_sl=20;
int start_tp=20;
double SL;
double TP;
SL=Bid+(start_sl*Point);
TP=Bid-(start_tp*Point);
int ticket1=OrderSend(Symb, type, lot1, Ask, 2, SL, TP);
if (ticket1{
Alert("Ошибка открытия ордера №1: ",GetLastError()," Тип:",type, " Цена:",Ask," SL:",SL," TP:",TP);
}
}

Прошу коллективный разум помочь, в чем ошибка?
Спасибо всем за внимание!

Добавил:
терминал билд 840
проверил торговый приказ, в частности содержимое переменных SL и TP - корректен он, а ошибка вываливается.
Если задаю 0,0 - SL и TP все работает.

Например, был такой вывод:
Ошибка открытия ордера №1: 130 Тип:OP_SELL Цена:1.1014 SL:1.1032 TP:1.0992 - но ведь данные корректны?

#2366

То, что на поверхности:
вместо string type="OP_SELL"; пиши int type=OP_SELL; //(я удивлен, что с другим типом работает)

и попробуй задавать СЛ и ТП после открытия ордера:
if (ticket1{
Alert("Ошибка открытия ордера №1: ",GetLastError()," Тип:",type, " Цена:",Ask," SL:",SL," TP:",TP);
}
else
{
OrderModify(...)
}

Изменено 8 июля, 2015 пользователем 0ll

#2367

Спасибо за идею - попробую модифицировать ордер после открытия, но есть опасения: а если не получится модифицировать - ордер останется висеть без стопа?

#2368


Спасибо за идею - попробую модифицировать ордер после открытия, но есть опасения: а если не получится модифицировать - ордер останется висеть без стопа?

Проверяй результат Модифи и зацикливай - как вариант...
#2369

Решил проблему!!!
Истина, как оказалось, была где-то рядом...

Проблема была в строке string type="OP_SELL"; это значение не принималось.
Ордер-то открывался BUY, соответственно и стопы с профитами были некорректны.

Переменная, передаваемая в ordersend должна быть числовая, а не текстовая - отсюда все проблемы.
Виновата моя невнимательность. Прошу у всех прощения за беспокойство и огромное спасибо всем за помощь!


Добавлено: 08-07-2015 08:35:59

0ll - Вы мне очень помогли, спасибо!!! =d>
#2370
VSATester, спасибо принято говорить "с занесением в личное дело" - для этого 2 кнопки в каждом посте.
Это раз.

А второе - а где код работающего скрипта для форумчан?
Неработающий код выложили - а работающий скрипт нет.
Помощь на форуме получил - делись с форумом исправленным рабочим скриптом.
#2371

Работающий код.

void OnStart()
{
string Symb=Symbol();

double lot1=0.01;
int start_sl=20;
int start_tp=20;

int type=1; // SELL

double SL=Bid+(start_sl*Point);
double TP=Bid-(start_tp*Point);

int ticket1=OrderSend(Symb, type, lot1, Bid, 2, SL, TP);
if (ticket1 {
Alert("Ошибка открытия ордера №1: ",GetLastError(), " Цена:",Ask," SL:",SL," TP:",TP);
}
}

#2372
VSATester, а обрезать ТП/СЛ до значности счета не хотите?
Насколько помню, это тоже одна из причин отказа в выставлении ордера.

Что касается выставления ТП/СЛ в момент открытия рыночного ордера, то на ECN счетах это же вроде недопустимо: там ордер сначала открывается с нулевыми ТП/СЛ - а потом модифицируется .

И, наконец, как насчет бай ордеров, мэджика и коммента?

Какой-то странный у вас "работающий" скрипт пока - слегка, местами работающий... :)
#2373

Если вот так стоп лос записать будет учитываться комиссия ? SL = NormalizeDouble ( Ask + (OrderCommission() + OrderSwap() + TrailingStop) * Point,Digits);

#2374

Если вот так стоп лос записать будет учитываться комиссия ? SL = NormalizeDouble ( Ask + (OrderCommission() + OrderSwap() + TrailingStop) * Point,Digits);

учесть комиссию можно по-разному... :d , принципиально: если в формуле есть OrderCommission(), то значит она учитывается...
А теперь серьёзно: OrderCommission() выдаёт результат в валюте счёта, Вы торгуете мало того, что другую валюту (возможно), так ещё и бабки учитываете как пункты! Если делать правильно, то надо переводить комиссию (в валюте депо) в пункты по торгуемой паре, а только потом пересчитывать СЛ.
Мне раньше думалось, что это очевидно...
#2375

Условия стали выполнятся когда сделал так
i = 0;
double force = iForce(NULL,0, FORCE_period, FORCE_method, FORCE_applied_price, 1);
if(force > -FORCE_level && force {
for(i=1; i {
RefreshRates();
double FORCE = iForce(NULL,0, FORCE_period, FORCE_method, FORCE_applied_price, i);
if(FORCE > -FORCE_level && FORCE if(FORCE >= FORCE_level)break;
if(FORCE }
}
double CCI = iCCI(NULL, 0, CCI_period, CCI_price, 1);
double CCI2 = iCCI(NULL, 0, CCI_period, CCI_price, 2);
if(i>=Bars_2)
{
if(CCI2 -CCI_level)return(OP_BUYLIMIT);
if(CCI2 > CCI_level && CCI }

Изменено 11 июля, 2015 пользователем hackas

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

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