Помогите написать сигнал с двух индикаторов,FORCE и CCi,как это сделать через цикл?или как то по другому?
Условие,если FORCE находится внутри канала ( Force > -FORCE_level && Force if(CCiпосле и больше 55 баров так же смотрим на CCi
if(CCI > CCI_level)return(OP_SELL);
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Через цикл или просто на каждом баре отслеживаете вход/выход индюка из канала и сохраняете время события.
Через цикл или просто на каждом баре отслеживаете вход/выход индюка из канала и сохраняете время события.
А как ч через цикл?как именно? Если можно на примере,спасибо
Примерно так:
А как ч через цикл?как именно? Если можно на примере,спасибо
Через цикл или просто на каждом баре отслеживаете вход/выход индюка из канала и сохраняете время события.
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) //Условие выполнено - проверяем ССИ и вход
{
}
После вызова ОрдерСэнд проверяете магик если
Здравстуйте! От ошибки "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.
Причем по отложенному ордеру бай-стоп открылся ордер бай, а в журнале (в этом сообщении, при условии если тикет
Не могу понять из-за чего так происходит???
Чего-ж тут непонятного? Всё просто:Не могу понять из-за чего так происходит???
Бай открылся и в тут-же попытка открыть рыночный Селл (Type: 1) , а т.к. цена ордера не соответствует текущей цене - выдаёт ошибку. Ищите почему у Вас открывается рыночный Селл.
Чего-ж тут непонятного? Всё просто:Не могу понять из-за чего так происходит???
Бай открылся и в тут-же попытка открыть рыночный Селл (Type: 1) , а т.к. цена ордера не соответствует текущей цене - выдаёт ошибку. Ищите почему у Вас открывается рыночный Селл.
Нет, не рыночный, а выставляется отложенный селл-стоп, по другому уровню и с ним проблем нет! Проблема иногда появляется, когда срабатывает бай-стоп и открывается ордер бай...
Я ничего не знаю про Селл-Стоп, я вижу в журнале "Type: 1" - это обычный Селл или Вы что-то другое в журнал выводите?
Нет, не рыночный, а выставляется отложенный селл-стоп, по другому уровню и с ним проблем нет! Проблема иногда появляется, когда срабатывает бай-стоп и открывается ордер бай...
Чего-ж тут непонятного? Всё просто:Не могу понять из-за чего так происходит???
Бай открылся и в тут-же попытка открыть рыночный Селл (Type: 1) , а т.к. цена ордера не соответствует текущей цене - выдаёт ошибку. Ищите почему у Вас открывается рыночный Селл.
Примерно так:
А как ч через цикл?как именно? Если можно на примере,спасибо
Через цикл или просто на каждом баре отслеживаете вход/выход индюка из канала и сохраняете время события.
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 пользователем Старик
Oll не получается у меня получить прибыльность 5 , 3.7 максимально , а мартин чистый ставить не хочу, кое что переделал и просадка уже больше 30 % пошла. Как вынести флаги на true или folse не разбирусь? В коде как написать.
Что значит "вынести"? Флаг это булева переменная:Как вынести флаги на true или folse не разбирусь? В коде как написать.
bool flag;
flag = true; - может это?
Что значит "вынести"? Флаг это булева переменная:Как вынести флаги на true или folse не разбирусь? В коде как написать.
bool flag;
flag = true; - может это?
Все мучею запрет на работу советника в разные стороны бай и сел , хочу в настройки вынести true . Не получается сделать запрет в коде , не пойму куда вставить и как правильно записать.
Так-бы сразу и написал:Все мучею запрет на работу советника в разные стороны бай и сел , хочу в настройки вынести true . Не получается сделать запрет в коде , не пойму куда вставить и как правильно записать.
enum DIRenum { Авто=-1, Бай=0, Селл=1 }; // это сверху во внешних параметрах
input DIRenum Направление_входа = Авто;
if (Направление_входа == Авто) // здесь определяешь направление, если режим - авто
{
}
else // здесь просто входишь по заданному в Направление_входа направлению
{
}
Добрый день, коллеги трейдеры.
Имеется проблема в работе скрипта. Скрипт простейший - открывает ордер. Проблема в том, что никак не дается рассчет стоп-лосса и тейк профита. Задаю эти параметры в команде - вылетает ошибка, хотя они вроде бы корректные. Пробую задать фиксированные - то же ошибка. В общем, непонятно.
Вот код:
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 - но ведь данные корректны?
То, что на поверхности:
вместо string type="OP_SELL"; пиши int type=OP_SELL; //(я удивлен, что с другим типом работает)
и попробуй задавать СЛ и ТП после открытия ордера:
if (ticket1{
Alert("Ошибка открытия ордера №1: ",GetLastError()," Тип:",type, " Цена:",Ask," SL:",SL," TP:",TP);
}
else
{
OrderModify(...)
}
Изменено 8 июля, 2015 пользователем 0ll
Спасибо за идею - попробую модифицировать ордер после открытия, но есть опасения: а если не получится модифицировать - ордер останется висеть без стопа?
Проверяй результат Модифи и зацикливай - как вариант...
Спасибо за идею - попробую модифицировать ордер после открытия, но есть опасения: а если не получится модифицировать - ордер останется висеть без стопа?
Решил проблему!!!
Истина, как оказалось, была где-то рядом...
Проблема была в строке string type="OP_SELL"; это значение не принималось.
Ордер-то открывался BUY, соответственно и стопы с профитами были некорректны.
Переменная, передаваемая в ordersend должна быть числовая, а не текстовая - отсюда все проблемы.
Виновата моя невнимательность. Прошу у всех прощения за беспокойство и огромное спасибо всем за помощь!
Добавлено: 08-07-2015 08:35:59
0ll - Вы мне очень помогли, спасибо!!! =d>
Это раз.
А второе - а где код работающего скрипта для форумчан?
Неработающий код выложили - а работающий скрипт нет.
Помощь на форуме получил - делись с форумом исправленным рабочим скриптом.
Работающий код.
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);
}
}
Насколько помню, это тоже одна из причин отказа в выставлении ордера.
Что касается выставления ТП/СЛ в момент открытия рыночного ордера, то на ECN счетах это же вроде недопустимо: там ордер сначала открывается с нулевыми ТП/СЛ - а потом модифицируется .
И, наконец, как насчет бай ордеров, мэджика и коммента?
Какой-то странный у вас "работающий" скрипт пока - слегка, местами работающий... :)
Если вот так стоп лос записать будет учитываться комиссия ? SL = NormalizeDouble ( Ask + (OrderCommission() + OrderSwap() + TrailingStop) * Point,Digits);
учесть комиссию можно по-разному... :d , принципиально: если в формуле есть OrderCommission(), то значит она учитывается...Если вот так стоп лос записать будет учитываться комиссия ? SL = NormalizeDouble ( Ask + (OrderCommission() + OrderSwap() + TrailingStop) * Point,Digits);
А теперь серьёзно: OrderCommission() выдаёт результат в валюте счёта, Вы торгуете мало того, что другую валюту (возможно), так ещё и бабки учитываете как пункты! Если делать правильно, то надо переводить комиссию (в валюте депо) в пункты по торгуемой паре, а только потом пересчитывать СЛ.
Мне раньше думалось, что это очевидно...
Условия стали выполнятся когда сделал так
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
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем