Виталий, я сделал как вы сказали, но что-то не поменялось ничего. Видимо косяк зарыт где-то в другом месте.
До этого у меня всё (открытие ордеров - модификация и перевод в б.у. по достижению заданного уровня цены) и всё работало. Было так:
bool Trade (int signal)
{
FindOrders();
double sl = 0, tp = 0;
if(signal == SIGNAL_BUY) // Если сигнал на покупку и открытых ордеров нет...if(!OpenBuy()) // открываем лимитный ордер на покупкуreturn(false);
if(signal == SIGNAL_SELL) // Если сигнал на продажу и открытых ордеров нет..if(!OpenSell()) // Открываем лимитный ордер на продажуreturn(false);
int total = OrdersTotal() - 1;
for(int i=total; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true) // Если ордер есть и он выбран..
{
if(g_type == OP_BUY)
{
if(i_sl != 0) // Если входной параметр стоп-лосса не равен 0, то..
sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits); // Получаем значение стоп-лосса для выбранного ордераif(i_tp != 0) // Если входной параметр тейкпрофита не равен 0, то..
tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits); // Получаем значение тейкпрофита для выбранного ордера
}
if(g_type == OP_SELL)
{
if(i_sl != 0) // Если входной параметр стоп-лосса не равен 0, то..
sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits); // Получаем значение стоп-лосса для выбранного ордераif(i_tp != 0) // Если входной параметр тейкпрофита не равен 0, то..
tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits); // Получаем значение тейкпрофита для выбранного ордера
}
if(sl != 0 || tp != 0) // Если полученные значения sl и tp не равныы 0, то..
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); // Модифицируем ордер
}
}
}
return(true);
}
Сейчас, как я разложил всё на канкретные специализированные функции, работать перестало всё суцельно. И так и так уже пробую, ничего не выходит. стопы не ставятся.
double sl = 0, tp = 0; // тут присвоили по нулямfor(int i=total; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true) // Если ордер есть и он выбран..
{
if(g_type == OP_BUY)
{
if(i_sl != 0) // замените на if(sl == 0) // Если входной параметр стоп-лосса не равен 0, то..
sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits); // Если по нулям, тогда выполнится условие!
Ну а логика то где? Хочется понять очень.. Есть вот функция:
void OrdersModifying()
{
int total = OrdersTotal() - 1;
double sl = 0, tp = 0;
for(int i=total; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true) // Если ордер есть и он выбран..
{
if(g_type == OP_BUY)
{
if(i_sl != 0) // Если входной параметр стоп-лосса не равен 0, то..
sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits); // Получаем значение стоп-лосса для выбранного ордераif(i_tp != 0) // Если входной параметр тейкпрофита не равен 0, то..
tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits); // Получаем значение тейкпрофита для выбранного ордера
}
if(g_type == OP_SELL)
{
if(i_sl != 0) // Если входной параметр стоп-лосса не равен 0, то..
sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits); // Получаем значение стоп-лосса для выбранного ордераif(i_tp != 0) // Если входной параметр тейкпрофита не равен 0, то..
tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits); // Получаем значение тейкпрофита для выбранного ордера
}
if(sl != 0 || tp != 0) // Если полученные значения sl и tp не равныы 0, то..
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); // Модифицируем ордер
}
}
}
}
Порядок такой, если вводные т.е. внешние переменные стопа и тейка, а это i_sl и i_tp не равны нулю, тогда мы получаем цены стопа и тейка, которые будут уже в ордере, а это sl и tp. После того я проверю, вычислили мы sl и tp тут(если для шорта):
if(i_sl != 0) // Если входной параметр стоп-лосса не равен 0, то..
sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits); // Получаем значение стоп-лосса для выбранного ордераif(i_tp != 0) // Если входной параметр тейкпрофита не равен 0, то..
tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits); // Получаем значение тейкпрофита для выбранного ордера
}
Если значения получены, тогда нулю они равны быть не могут.. ведь они будут изменены! Это же переменные, которые мы получаем последовательно по контексту кода.
А тут, я проверил нашли ли мы значения стопа и тейка. Как они могут после всех условий быть ноль?
if(sl != 0 || tp != 0) // Если полученные значения sl и tp не равныы 0, то..
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); // Модифицируем ордер
}
Ну а логика то где? Хочется понять очень.. Есть вот функция:
Порядок такой, если вводные т.е. внешние переменные стопа и тейка, а это i_sl и i_tp не равны нулю, тогда мы получаем цены стопа и тейка, которые будут уже в ордере, а это sl и tp. После того я проверю, вычислили мы sl и tp тут(если для шорта):
Если значения получены, тогда нулю они равны быть не могут.. ведь они будут изменены! Это же переменные, которые мы получаем последовательно по контексту кода.
А тут, я проверил нашли ли мы значения стопа и тейка. Как они могут после всех условий быть ноль?
Блин, только что заметил, не if(g_type == OP_BUY), а if( OrderType( ) == OP_BUY|| OrderType( ) == OP_BUYSTOP ||OrderType( ) == OP_BUYLIMIT ) не помню, какие ордера вы открываете
Блин, только что заметил, не if(g_type == OP_BUY), а if( OrderType( ) == OP_BUY|| OrderType( ) == OP_BUYSTOP ||OrderType( ) == OP_BUYLIMIT ) не помню, какие ордера вы открываете
У меня эта функция модифицирует все 4 типа ордеров и 2 типа позиций, больше не существует!
Проблема с Symbol() MT4:
2 функции для иллюстрации:
Исполнение первой выводит пустую строку:
А вот вторая функция строковый идентификатор "EURUSD" (ну, зависит от графика, но выводи, хотя по логике функции должна быть пустая строка):
Помогите понять, что не так? Спасибо
Нельзя использовать при объявлении своих переменных зарезервированные названия(value), назовите _value
Вот я так сделал:
Стопов и тейков нет. В журнале пишится ошибка 130, мол не верный стопы. Причины я не наблюдаю.
И не будут!
Виталий, я сделал как вы сказали, но что-то не поменялось ничего. Видимо косяк зарыт где-то в другом месте.
До этого у меня всё (открытие ордеров - модификация и перевод в б.у. по достижению заданного уровня цены) и всё работало. Было так:
Сейчас, как я разложил всё на канкретные специализированные функции, работать перестало всё суцельно. И так и так уже пробую, ничего не выходит. стопы не ставятся.
И не будут!
Ну а логика то где? Хочется понять очень.. Есть вот функция:
Порядок такой, если вводные т.е. внешние переменные стопа и тейка, а это i_sl и i_tp не равны нулю, тогда мы получаем цены стопа и тейка, которые будут уже в ордере, а это sl и tp. После того я проверю, вычислили мы sl и tp тут(если для шорта):
Если значения получены, тогда нулю они равны быть не могут.. ведь они будут изменены! Это же переменные, которые мы получаем последовательно по контексту кода.
А тут, я проверил нашли ли мы значения стопа и тейка. Как они могут после всех условий быть ноль?
Сначала выстройте свою логику в старте, потом делайте функции, файлы и т. п.
Зачем чесать левой рукой за правым ухом?!
У меня функция начинается с объявления параметров, см. у Кима!
У меня функция начинается с объявления параметров, см. у Кима!
Это мне?
Ну а логика то где? Хочется понять очень.. Есть вот функция:
Порядок такой, если вводные т.е. внешние переменные стопа и тейка, а это i_sl и i_tp не равны нулю, тогда мы получаем цены стопа и тейка, которые будут уже в ордере, а это sl и tp. После того я проверю, вычислили мы sl и tp тут(если для шорта):
Если значения получены, тогда нулю они равны быть не могут.. ведь они будут изменены! Это же переменные, которые мы получаем последовательно по контексту кода.
А тут, я проверил нашли ли мы значения стопа и тейка. Как они могут после всех условий быть ноль?
Блин, только что заметил, не if(g_type == OP_BUY), а if( OrderType( ) == OP_BUY || OrderType( ) == OP_BUYSTOP || OrderType( ) == OP_BUYLIMIT ) не помню, какие ордера вы открываете
Это мне?
Блин, только что заметил, не if(g_type == OP_BUY), а if( OrderType( ) == OP_BUY || OrderType( ) == OP_BUYSTOP || OrderType( ) == OP_BUYLIMIT ) не помню, какие ордера вы открываете