иногда в скриптах используется #property show_inputs, для вывода диалога с параметрами, как в советнике (он там как само собой разумеещееся), а так трудно отличить..
Не удержался до утра. Стало чуть лучше, но места цветников из ордеров избежать не удалось. Как можно прописать единичное выставление ордера при требуемом условии? Вы упоминали: не, так не выйдет. только через анализ истории ордеров - как это можно сделать или что ещё подходящее можно применить?
примерно так
int i,orders_total=OrdersTotal();
bool order_on_last_bar=false;
if(orders_total>0) //если есть ордера
{
for(i=orders_total-1;i>=0;i--) //перебираем их все
{
OrderSelect(i,SELECT_BY_POS);
if(iBarShift(OrderOpenTime())==0) //если номер бара, соответствующего сремени открытия, равен 0
order_on_last_bar=true; //фиксируем этот факт
}
}
if(order_on_last_bar==false) // на нулевом баре нет открытых ордеров
{
//делаем то что нам нужно
}
Заполнил все значения функции iBarShift (компиляция ругалась до этого), int i уже была объявлена выше, пробовал и удалят этот повтор и для чистоты эксперимента заменил на j, чёт не получается - на некоторых барах получается множественное открытие/закрытие ордеров. Ниже привожу код с условием на открытие, может что напутал. Что ещё можно предпринять?
int j,orders_total=OrdersTotal();
bool order_on_last_bar=false;
if(orders_total>0) //если есть ордера
{
for(j=orders_total-1;j>=0;j--) //перебираем их все
{
OrderSelect(j,SELECT_BY_POS);
if(iBarShift(NULL,0,OrderOpenTime())==0) //если номер бара, соответствующего времени открытия, равен 0
order_on_last_bar=true; //фиксируем этот факт
}
}
if(order_on_last_bar==false) // на нулевом баре нет открытых ордеров
{
while(true) // Цикл закрытия орд.
{
if (Total==0 && Opn_B==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данныхAlert("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,0,0);//Открытие Buyif (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попыткаreturn; // Выход из start()
}
if (Total==0 && Opn_S==true) // Открытых орд. нет +
{ // критерий откр. Sell
RefreshRates(); // Обновление данныхAlert("Попытка открыть Sell. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,0,0);//Открытие Selif (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Sell ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попыткаreturn; // Выход из start()
}
break; // Выход из while
}
}
Заполнил все значения функции iBarShift (компиляция ругалась до этого), int i уже была объявлена выше, пробовал и удалят этот повтор и для чистоты эксперимента заменил на j, чёт не получается - на некоторых барах получается множественное открытие/закрытие ордеров. Ниже привожу код с условием на открытие, может что напутал. Что ещё можно предпринять?
1. Что такое переменная Total, где присваивается ей значение?
2. перед вторым if(Total==0 лучше все таки поставить else if(
int start()
{
int
Total, // Количество ордеров в окне
...
// Учёт ордеров
Symb=Symbol(); // Название фин.инстр.
Total=0; // Количество ордеровfor(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:if (OrderSymbol()!=Symb)continue; // Не наш фин. инструмif (OrderType()>1) // Попался отложенный
{
Alert("Обнаружен отложенный ордер. Эксперт не работает.");
return; // Выход из start()
}
Total++; // Счётчик рыночн. ордif (Total>1) // Не более одного орд
{
Alert("Несколько рыночных ордеров. Эксперт не работает.");
return; // Выход из start()
}
Ticket=OrderTicket(); // Номер выбранн. орд.
Tip =OrderType(); // Тип выбранного орд.
Price =OrderOpenPrice(); // Цена выбранн. орд.
SL =OrderStopLoss(); // SL выбранного орд.
TP =OrderTakeProfit(); // TP выбранного орд.
Lot =OrderLots(); // Количество лотов
}
}
скрипты неотличимы от советников..
иногда в скриптах используется #property show_inputs, для вывода диалога с параметрами, как в советнике (он там как само собой разумеещееся), а так трудно отличить..
Подскажите алгоритм.. Необходимо найти время хая и лоя старшего таймфрема в младшем.
Подскажите алгоритм.. Необходимо найти время хая и лоя старшего таймфрема в младшем.
Запомните или сразу используйте i - найденный индекс.
А iTime(NULL,TF2,i) - будет время.
Не удержался до утра. Стало чуть лучше, но места цветников из ордеров избежать не удалось. Как можно прописать единичное выставление ордера при требуемом условии? Вы упоминали: не, так не выйдет. только через анализ истории ордеров - как это можно сделать или что ещё подходящее можно применить?
примерно так
Я уже спрашивал когда то, потом забил, а вот сейчас опять понадобилась такая фишка, расчёт максимального объёма для открытия позы. Пишу так:
Но Max_lots равно нулю постоянно... Может кто знает более грамотную конструкцию расчета такой фишки?
примерно так
Заполнил все значения функции iBarShift (компиляция ругалась до этого), int i уже была объявлена выше, пробовал и удалят этот повтор и для чистоты эксперимента заменил на j, чёт не получается - на некоторых барах получается множественное открытие/закрытие ордеров. Ниже привожу код с условием на открытие, может что напутал. Что ещё можно предпринять?
Заполнил все значения функции iBarShift (компиляция ругалась до этого), int i уже была объявлена выше, пробовал и удалят этот повтор и для чистоты эксперимента заменил на j, чёт не получается - на некоторых барах получается множественное открытие/закрытие ордеров. Ниже привожу код с условием на открытие, может что напутал. Что ещё можно предпринять?
1. Что такое переменная Total, где присваивается ей значение?
2. перед вторым if(Total==0 лучше все таки поставить else if(
1. Что такое переменная Total, где присваивается ей значение?
За основу взят пример из стать Простой эксперт: https://book.mql4.com/ru/samples/expert
alsu:
2. перед вторым if(Total==0 лучше все таки поставить else if(
Не помогло. alsu, извините за навязчивость, но очень уж хочется разобраться (довести дело до конца).
ничего страшного.
попробуйте заомментировать /* */ кусок кода из простого эксперта, а Total заменить на orders_total - переменную, которую мы объявили сами.