AlexeyVik
Программист mql4 mql5
Правильно, но хотя-бы проверку по символу сделай.прет,
хотел сделать чтоб робот работал после открытия ордера вручную и вел дальше...
какой меджик прописать чтоб он определял и вел их дальше правильно? 0?
Правильно, но хотя-бы проверку по символу сделай.прет,
хотел сделать чтоб робот работал после открытия ордера вручную и вел дальше...
какой меджик прописать чтоб он определял и вел их дальше правильно? 0?
Ему, это кому? И что убрать хочешь???проверку прошел, я ему номер присвоил, терь просто убрать хочу...
Привет всем. Преобразовал сов из mql4 в mql5. И при компиляции пишет две ошибки
unexpected end of program - показывает на самую последнюю закрываемую скобку}
unbalanced parentheses - показывает на начало int OnInit() {
Может кто-нибудь подсказать, это возможно исправить?
Количество фигурных скобок вручную проверь, либо где-то лишняя, либо не хватает.
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции |
//+-------------------------------------------------------------------------------------+
int OpenBuy()
{
g_ticket = -1;
string myNote = "сов баянул";
g_ticket = OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
return(g_ticket);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции |
//+-------------------------------------------------------------------------------------+
int OpenSell()
{
g_ticket = -1;
string myNote = "сов шортанул";
g_ticket = OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
return(g_ticket);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций |
//+-------------------------------------------------------------------------------------+
bool Trade (int signal)
{
double sl = 0, tp = 0;
if(signal == SIGNAL_BUY && FindOrders() == 0)
{
g_ticket = OpenBuy();
}
if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
{
if(i_sl > 0)
sl = NormalizeDouble(OrderOpenPrice() - i_sl*Point,Digits);
if(i_tp > 0)
tp = NormalizeDouble(OrderOpenPrice() + i_tp*Point,Digits);
Print("slb = ", sl); Print("tpb = ", tp);
if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
{
if((tp - OrderOpenPrice() >= g_stopLevel) && (OrderOpenPrice() - sl >= g_stopLevel))
Print("slb_cor = ", sl); Print("tpb_cor = ", tp);
{
OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
return(true);
}
}
}
if(signal == SIGNAL_SELL && FindOrders() == 0)
{
g_ticket = OpenSell();
}
if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
{
if(i_sl > 0)
sl = NormalizeDouble(OrderOpenPrice() + i_sl*Point,Digits);
if(i_tp > 0)
tp = NormalizeDouble(OrderOpenPrice() - i_tp*Point,Digits);
Print("slb = ", sl); Print("tpb = ", tp);
Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());
if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
{
if((OrderOpenPrice() - tp >= g_stopLevel) && (sl - OrderOpenPrice() >= g_stopLevel))
Print("sls_cor = ", sl); Print("tps_cor = ", tp);
{
OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
return(true);
}
}
}
return(true);
}
Стопы это не только стопы, но и цены отложек. Скорее всего ты выставляешь или слишком близко к цене или не в той стороне(байстоп ниже цены).Вот функции открытия ордеров байлимит и селлимит и сама торговая функция:
...
Суть такая. Чтоб советник то работает, но раз за разом вылазит ошибка 130
Согласно справке это неверные стопы. Но я прогоняю в визуале и принтовал, стопы вполне адекватные. Что тут может быть не так?
Функцию я написал вроде как правильно и логично всё.
Здесь g_stopLevel - это стоплевел есс-но.
i_sl и i_tp - это вводные СтопЛосс и ТейкПрофит.
Стопы это не только стопы, но и цены отложек. Скорее всего ты выставляешь или слишком близко к цене или не в той стороне(байстоп ниже цены).
if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
{
if((tp - OrderOpenPrice() >= g_stopLevel) && (OrderOpenPrice() - sl >= g_stopLevel))
{
OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
return(true);
}
}
if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
2012.12.06 23:13:56 2008.12.09 10:23 Gann_2Days GBPUSD,H1: OrderStopLoss() = 1.5039
2012.12.06 23:13:56 2008.12.09 10:23 Gann_2Days GBPUSD,H1: OrderTakeProfit() = 1.4949
bool Trade (int signal)
{
double OSL = OrderStopLoss();
double OTP = OrderTakeProfit();
double sl = 0, tp = 0;
OSL = 0; OTP = 0;
Print("OSL = ", OSL); Print("OTP = ", OTP);
Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());
2012.12.07 00:27:54 2008.12.05 00:03 Gann_2Days GBPUSD,H1: open #1 buy limit 0.10 GBPUSD at 1.46425 ok
2012.12.07 00:27:54 2008.12.05 00:03 Gann_2Days GBPUSD,H1: OrderStopLoss() = 1.4639
2012.12.07 00:27:54 2008.12.05 00:03 Gann_2Days GBPUSD,H1: OrderTakeProfit() = 1.4729
2012.12.07 00:27:54 2008.12.05 00:03 Gann_2Days GBPUSD,H1: OTP = 0
2012.12.07 00:27:54 2008.12.05 00:03 Gann_2Days GBPUSD,H1: OSL = 0
2012.12.07 00:27:51 Gann_2Days inputs: i_sl=450; i_tp=450; i_momTF=60; i_momPeriod=18;
Глюки в голове. Чё написал то и принтуется. Сам же обнулил значения OSL и OTP, с чего они вдруг должны быть равны OrderStopLoss() и OrderTakeProfit() ?В общем-то я покопался и понял, где косяк. Вот добавил в начале ф-ции специально переменные OSL и OSL, и обнулил эти значение.
double OSL = OrderStopLoss();
double OTP = OrderTakeProfit();
double sl = 0, tp = 0;
OSL = 0; OTP = 0;
Print("OSL = ", OSL); Print("OTP = ", OTP);
Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());
Далее начинается самое интересно! Я принтую как переменные так и полные названия соответствующих им ф-ций и вижу:
Что это такое? Глюки МТ4 ?
По логике должно распринтовать одинаковые значения для OrderStopLoss() и OSL, и, соответственно, для OrderTakeProfit() и OTP.
Глюки в голове. Чё написал то и принтуется. Сам же обнулил значения OSL и OTP, с чего они вдруг должны быть равны OrderStopLoss() и OrderTakeProfit() ?
Сам себя запутываешь, а потом ищешь глюки в МТ4.
bool Trade (int signal)
{
double OSL = 0;
double OTP = 0;
OrderStopLoss() = OSL;
//double OTP = OrderTakeProfit();
double sl = 0, tp = 0;
Print("OSL = ", OSL); Print("OTP = ", OTP);
Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());
OrderStopLoss()
Никак нельзя обнулить переменные OrderStopLoss() и OrderTakeProfit(). Хотя бы потому что это не переменные, а функци. Они возвращают значения стоп лосс и тейк профит выбранного ордера. Что бы они возвращали 0, нужно предварительно выбрать ордер без стоп лосс и тейк профит уровней.Поздно писал, ошибся. Но тут возникает момент. Вот так сделать нельзя:
Т.е. присвоить значение переменной OrderStopLoss() значение переменной OSL. Так же нет возможности обнулить значение переменной, т.е.:PHP:bool Trade (int signal) { double OSL = 0; double OTP = 0; OrderStopLoss() = OSL; //double OTP = OrderTakeProfit(); double sl = 0, tp = 0; Print("OSL = ", OSL); Print("OTP = ", OTP); Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());
Так написать неверно, т.к. не компилится в таком виде.Код:OrderStopLoss()
Но на входу у меня OrderStopLoss() и OrderTakeProfit() уже имею значения, которые им не давались по коду выше. Как мне их обнулить тогда?
Никак нельзя обнулить переменные OrderStopLoss() и OrderTakeProfit(). Хотя бы потому что это не переменные, а функци. Они возвращают значения стоп лосс и тейк профит выбранного ордера. Что бы они возвращали 0, нужно предварительно выбрать ордер без стоп лосс и тейк профит уровней.
Может стоит сначала заглянуть в справочник, а лучше в учебник? Пожалуй для того кто путает функции с переменными, стоит начинать с учебника. А про пользовательские функции стоит вообще пока забыть. Вот когда будет написано куча программ и в них будут часто использоваться одинаковые куски кода, много кратно проверенные и отлаженные, стоит подумать о выделении их в функции и библиотеки.
//+-------------------------------------------------------------------------------------+
//| Открытие позиций |
//+-------------------------------------------------------------------------------------+
bool Trade (int signal)
{
double sl = 0, tp = 0;
Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());
if(signal == SIGNAL_BUY && FindOrders() < 5)
{
g_ticket = OpenBuy();
}
if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
{
if(i_sl > 0)
sl = NormalizeDouble(OrderOpenPrice() - i_sl*Point,Digits);
if(i_tp > 0)
tp = NormalizeDouble(OrderOpenPrice() + i_tp*Point,Digits);
// Print("slb = ", sl); Print("tpb = ", tp);
// Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());
if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
{
if((tp - OrderOpenPrice() >= g_stopLevel) && (OrderOpenPrice() - sl >= g_stopLevel))
Print("slb_cor = ", sl); Print("tpb_cor = ", tp);
{
OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
return(true);
}
}
}
if(signal == SIGNAL_SELL && FindOrders() < 5)
{
g_ticket = OpenSell();
}
if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
{
if(i_sl > 0)
sl = NormalizeDouble(OrderOpenPrice() + i_sl*Point,Digits);
if(i_tp > 0)
tp = NormalizeDouble(OrderOpenPrice() - i_tp*Point,Digits);
Print("slb = ", sl); Print("tpb = ", tp);
// Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());
if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
{
if((OrderOpenPrice() - tp >= g_stopLevel) && (sl - OrderOpenPrice() >= g_stopLevel))
Print("sls_cor = ", sl); Print("tps_cor = ", tp);
{
OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
return(true);
}
}
}
return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции |
//+-------------------------------------------------------------------------------------+
int OpenBuy()
{
g_ticket = -1;
string myNote = "сов баянул";
g_ticket = OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
return(g_ticket);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции |
//+-------------------------------------------------------------------------------------+
int OpenSell()
{
g_ticket = -1;
string myNote = "сов шортанул";
g_ticket = OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
return(g_ticket);
}
double OrderStopLoss( )Возвращает значение цены закрытия позиции при достижении уровня убыточности (stop loss) для текущего выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
if(signal == SIGNAL_BUY && FindOrders() < 5)
{
g_ticket = OpenBuy();
}
if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
{
if(i_sl > 0)
sl = NormalizeDouble(OrderOpenPrice() - i_sl*Point,Digits);
if(i_tp > 0)
tp = NormalizeDouble(OrderOpenPrice() + i_tp*Point,Digits);
// Print("slb = ", sl); Print("tpb = ", tp);
// Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());
if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
{
if((tp - OrderOpenPrice() >= g_stopLevel) && (OrderOpenPrice() - sl >= g_stopLevel))
Print("slb_cor = ", sl); Print("tpb_cor = ", tp);
{
OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
return(true);
}
}
}
if(signal == SIGNAL_BUY && FindOrders() < 5)
{
g_ticket = OpenBuy();
}
if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
{
if(i_sl > 0)
sl = NormalizeDouble(OrderOpenPrice() - i_sl*Point,Digits);
if(i_tp > 0)
tp = NormalizeDouble(OrderOpenPrice() + i_tp*Point,Digits);
// Print("slb = ", sl); Print("tpb = ", tp);
// Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());
if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
{
if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
{
if((tp - OrderOpenPrice() >= g_stopLevel) && (OrderOpenPrice() - sl >= g_stopLevel))
Print("slb_cor = ", sl); Print("tpb_cor = ", tp);
{
OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
return(true);
}
}
}
`}
А если 10 раз выбрать один и тот же ордер, может советник станет в 10 раз прибыльней? И пользовательских функций надо побольше наплодить, что бы каждая из другой вызывалась, тогда точно будет печатать баксы быстрее ФРС.
Сам себя запутываешь. Пиши максимально просто, что бы сам понимал что написал.
bool Trade (int signal)
{
double sl = 0, tp = 0;
Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());
if(signal == SIGNAL_BUY && FindOrders() == 0)
{
g_ticket = OpenBuy();
if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
{
if(i_sl != 0)
sl = NormalizeDouble(OrderOpenPrice() - i_sl*Point,Digits);
if(i_tp != 0)
tp = NormalizeDouble(OrderOpenPrice() + i_tp*Point,Digits);
}
}
else if(signal == SIGNAL_SELL && FindOrders() == 0)
{
g_ticket = OpenSell();
if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
{
if(i_sl != 0)
sl = NormalizeDouble(OrderOpenPrice() + i_sl*Point,Digits);
if(i_tp != 0)
tp = NormalizeDouble(OrderOpenPrice() - i_tp*Point,Digits);
}
}
if(sl != 0 || tp != 0)
{
OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
return(true);
}
return(true);
}