Что Вы вкладываете в понятие "Цена поднялась выше +10 пунктов" или " Цена опустилась ниже -10 пунктов"?
Надо ордера как-то помечать. Если в рынке есть ордера стратегии 1 - работаем по ней, если в рынке ордера стратегии 2 - рабтаем по второй. Если в рынке нет ордеров - выбираем стрегию. Помечать ордера можно используя разные магики или комментарий ордера.
Необязательно, можно ордера передавать между стратегиями, ИМХО так даже перспективнее...
Что Вы вкладываете в понятие "Цена поднялась выше +10 пунктов" или " Цена опустилась ниже -10 пунктов"?
Необязательно, можно ордера передавать между стратегиями, ИМХО так даже перспективнее...
Тогда помечать ордера глобальными переменными с тикетом в имени переменной. Есть другие варианты? (Кроме записи в файл)
через массив...
OrderNomber001[2];
...
OrderNomber00X[2];
где
OrderNomber001[1] - реальный магик (живет до окончательного закрытия ордера)
OrderNomber001[2] - виртуальный магик, присваеваемый при переходе от стратегии к стратегии
имеется ввиду, что в магике закодирована стратегия...
через массив...
OrderNomber001[2];
...
OrderNomber00X[2];
где
OrderNomber001[1] - реальный магик (живет до окончательного закрытия ордера)
OrderNomber001[2] - виртуальный магик, присваеваемый при переходе от стратегии к стратегии
имеется ввиду, что в магике закодирована стратегия...
Как при этом разрулить ордера при перезапуске эксперта?
первое, что приходит - писать в файл, но если "процедура экстренного закрытия ордеров" не сработает - выполнение инвентаризации ордеров " при сбое" и попытка подхватить потеряную стратегию ( по текущим расчетам). "сбой" я имею ввиду вообще отключение терминала.
ведь вполне вероятно, что и "текущая" стратегия может устареть... поэтому либо инвентаризация и подхват по-новой, либо закрытие... я так вижу...
Здравствуйте! Помогите советом или поделитесь опытом как это сделать. Вот суть проблемы:
Нужно чтобы советник работал по двум разным стратегиям:
1. Цена поднялась выше +10 пунктов --- > стратегия1. И различное движение цены ниже 10 или выше пунктов никак не могло бы запустить стратегию2 и не включить повторно стратегию1 до тех пор пока количество ордеров не будет равно нулю.
2. Цена опустилась ниже -10 пунктов --->стратегия2. Различное движение Более 10 пунктов вверх или вниз не "включит" стратегию1 или повторно стратегию2 до тех пор пока количество ордеров не будет равно нулю.
Мне представляется это что-то вроде не полного RS-триггера. Но этот вариант не работает!
if (x1) { // если цена более +10 п. то..
if (!x2) { // если цена менее -10 п. то ..
y1=0; y2=1; // стратегия1 выкл, стратегия2 вкл.
while (x1);
}
} else {
if (x2) { // цена менее -10 п. то..
y1=1; y2=0; // стратегия1 вкл., стратегия2 выкл.
while (x2);
}
}
Заранее Спасибо!
Привет всем!
Вроде так понял по условию :
int strategy_flag;
int start()
{
if(OrdersTotal()==0){strategy_flag=0;}// обнулить флаг используемой стратегии т.к. нет открытых ордеров
if(strategy_flag==0) //если стратегия не используется проверим уссловие на выбор одной из предложенных
//непонятно в вопросе о какой цене идёт речь,т.е. относительно чего её выбирать ???
{ //допустим это цена закрытия последнего ордера тогда можем написать так
// double cena;
// if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY)==true)
// {cena = OrderClosePrice();}
// вместо "цена" в условии пишем cena и с трёх строк выше снимаем комент
if( цена+10 <= Bid){strategy_flag=1;} // условие выполнено активируем стратегию №1
if( цена-10 >= Ask){strategy_flag=2;} // условие выполнено активируем стратегию №2
}
if(strategy_flag==1)
{
код стратегии №1
}
if(strategy_flag==2)
{
код стратегии №2
}
}
Привет Всем! Вчера не мог нормально объяснить не у своего ПК был.
Вот Код
extern string Comment_MaxCountOrders = "Максимальное количество ордеров:"; extern int MaxCountOrders = 10; extern int MagicNumber = 12345; //--------------------------------------------------------------------------------------------------- double gd_240 = 0.0; double g_price_260; double g_price_261; double g_price_292; double g_price_293; double g_price_295; double gd_316; double gd_300; double gd_324; int gi_360 = 0; int gi_368 = 0; double gd_372; int g_pos_380 = 0; int gi_384; bool gi_396 = FALSE; bool gi_400 = FALSE; bool gi_404 = FALSE; bool gi_405 = FALSE; // bool gi_406 = FALSE; // int gi_408; bool gi_412 = FALSE; int g_datetime_416 = 0; int g_datetime_420 = 0; double gd_424; double gd_432; double MyPoint; // пункты для 3х и 5значных дилинговых центров //--------------------------------------------------------------------------------- int init() { if(Point==0.001 || Point==0.00001) MyPoint=Point*10; else MyPoint=Point; switch (MarketInfo(Symbol(), MODE_MINLOT)) { case 0.001: gd_240 = 3; break; case 0.01: gd_240 = 2; break; case 0.1: gd_240 = 1; break; case 1.0: gd_240 = 0; } return (0); } //-------------------------------------------------------------------------------- int deinit() { return (0); } //-------------------------------------------------------------------------------- int start() { // Ждем, когда сформируется новый бар if (gi_360 == Time[0]) return (0); gi_360 = Time[0]; ////// gi_384 = CountTrades(); // функция подсчёта ордеров if (gi_384 > 0 && gi_384 <= MaxCountOrders) { // условие Если (количество открытых ордеров > 0 И количество открытых ордеров <= Маx (число)) for (g_pos_380 = OrdersTotal() - 1; g_pos_380 >= 0; g_pos_380--) { // цикл определения ордеров Свой/чужой OrderSelect(g_pos_380, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY) { gi_400 = TRUE; // Ордер BUY gi_404 = FALSE; // break; } if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_SELL) { gi_400 = FALSE; gi_404 = TRUE; // Ордер SELL break; } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////// if (gi_384 > 0 && gi_384 <= MaxCountOrders) { // условие Если (количество открытых ордеров > 0 И количество открытых ордеров <= Маx (число)) RefreshRates(); gd_316 = FindLastBuyPrice(); // Функция определяет последнюю известную цену на Покупку gd_324 = FindLastSellPrice(); // Функция определяет последнюю известную цену на Продажу // так раньше было не полный RS -триггер if ((gi_400 && gd_316 - Ask >= StepLots1 * MyPoint)||(gi_404 && Bid - gd_324 >= StepLots1 * MyPoint)) { if (!((gi_400 && Bid - gd_316 >= StepLots2 * MyPoint)||(gi_404 && gd_324 - Ask >= StepLots2 * MyPoint))) { gi_405 = FALSE; // выключена стратегия1 gi_406 = TRUE; // включена стратегия2 } } else { if ((gi_400 && Bid - gd_316 >= StepLots2 * MyPoint)||(gi_404 && gd_324 - Ask >= StepLots2 * MyPoint)) { gi_405 = TRUE; // включена стратегия1 gi_406 = FALSE; // выключена стратегия2 } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// //-------------------------------------------------------------------------------- double FindLastBuyPrice() { //Функция определяет последнюю известную цену на Покупку double l_ord_open_price_8; int l_ticket_24; int l_ticket_20 = 0; for (int l_pos_16 = OrdersTotal() - 1; l_pos_16 >= 0; l_pos_16--) { OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY) { l_ticket_24 = OrderTicket(); if (l_ticket_24 > l_ticket_20) { l_ord_open_price_8 = NormalizeDouble(OrderOpenPrice(),Digits); l_ticket_20 = l_ticket_24; } } } return (l_ord_open_price_8); } //-------------------------------------------------------------------------------- double FindLastSellPrice() { // Функция определяет последнюю известную цену на Продажу double l_ord_open_price_8; int l_ticket_24; int l_ticket_20 = 0; for (int l_pos_16 = OrdersTotal() - 1; l_pos_16 >= 0; l_pos_16--) { OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_SELL) { l_ticket_24 = OrderTicket(); if (l_ticket_24 > l_ticket_20) { l_ord_open_price_8 = NormalizeDouble(OrderOpenPrice(),Digits); l_ticket_20 = l_ticket_24; } } } return (l_ord_open_price_8); }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте! Помогите советом или поделитесь опытом как это сделать. Вот суть проблемы:
Нужно чтобы советник работал по двум разным стратегиям:
1. Цена поднялась выше +10 пунктов --- > стратегия1. И различное движение цены ниже 10 или выше пунктов никак не могло бы запустить стратегию2 и не включить повторно стратегию1 до тех пор пока количество ордеров не будет равно нулю.
2. Цена опустилась ниже -10 пунктов --->стратегия2. Различное движение Более 10 пунктов вверх или вниз не "включит" стратегию1 или повторно стратегию2 до тех пор пока количество ордеров не будет равно нулю.
Мне представляется это что-то вроде не полного RS-триггера. Но этот вариант не работает!
if (x1) { // если цена более +10 п. то..
if (!x2) { // если цена менее -10 п. то ..
y1=0; y2=1; // стратегия1 выкл, стратегия2 вкл.
while (x1);
}
} else {
if (x2) { // цена менее -10 п. то..
y1=1; y2=0; // стратегия1 вкл., стратегия2 выкл.
while (x2);
}
}
Заранее Спасибо!