Форум » Консультации по программированию » Программирование. » Ответить

Программирование.

Эдуард: Здравствуйте. Подскажите, почему ордер не открывается? input int Slippage=30; input int Magic=156; input double Lot=0.1; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { double TP=0; double cena_ma_1=0; cena_ma_1=iMA(_Symbol,0,10,0,0,0,1); int total=OrdersTotal(); for(int i=total-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS)) if(OrderSymbol()==Symbol()) { double openB=OrderOpenPrice(); if(openB>cena_ma_1) { int tiket=OrderSend(_Symbol,OP_BUY,Lot,Ask,Slippage,0,TP,NULL,Magic,0,clrBlue); { Alert("Ордер открылся"); } } } }

Ответов - 46, стр: 1 2 3 4 All

Scriptong: allisbob пишет: что присваивается переменной dtLastOrderTime? Прошу прощения, опечатка. Это переменная dtLastTime.

bro: Скажите, как рассчитать СЛ и ТП по ADX / double adx(int bar) { return(iADX(Symbol(),0,ADX_Period,PRICE_CLOSE,MODE_MAIN,bar)); }

Scriptong: bro пишет: Скажите, как рассчитать СЛ и ТП по ADX / Чтобы привести какой-то код, нужно сначала определиться с тем, каким именно образом хочется рассчитывать SL и TP. То есть для начала метод нужно придумать и описать. Тогда и до кода можно дойти. Пока же Вы привели только код, который получает значение главной линии ADX.


bro: Scriptong пишет: Допустим главная линия ADX показывает 47.7708 Берем 47, для пятизнака будет 470 пунктов.

Scriptong: bro пишет: Допустим главная линия ADX показывает 47.7708 Берем 47, для пятизнака будет 470 пунктов. Ну тогда так. В настроечных параметрах: input uint i_uKoef = 10; // Коэффициент умножения пунктов enum ENUM_TRADE_SIGNAL { TRADE_SIGNAL_NONE, // Нет торгового сигнала TRADE_SIGNAL_BUY, // Торговый сигнал Buy TRADE_SIGNAL_SELL // Торговый сигнал Sell }; В функции расчета торгового сигнала: ENUM_TRADE_SIGNAL GetTradeSignal() { if (<условия для открытия Buy>) return TRADE_SIGNAL_BUY; if (<условия для открытия Sell>) return TRADE_SIGNAL_SELL; return TRADE_SIGNAL_NONE; } При открытии ордера: ENUM_TRADE_SIGNAL eSignal = GetTradeSignal(); if (eSignal == TRADE_SIGNAL_NONE) return; double fADXValue = MothRound(iADX(Symbol(),0,ADX_Period,PRICE_CLOSE,MODE_MAIN,bar)); if (eSignal == TRADE_SIGNAL_BUY) OrderSend(Symbol(), OP_BUY, fLots, uSlippage, Ask, Ask - fADXValue * i_uKoef, Ask + fADXValue * i_uKoef); if (eSignal == TRADE_SIGNAL_SELL) OrderSend(Symbol(), OP_SELL, fLots, uSlippage, Bid, Bid + fADXValue * i_uKoef, Bid - fADXValue * i_uKoef); Это грубо, конечно. Ведь перед открытием ордера нужно произвести огромное количество проверок.

bro: Здравствуйте. Интересует вопрос: можно ли на нулевом баре гарантированно открывать ордера. Допустим если уже есть Бай, то при состоянии "индикатор ниже уровня" гарантированно откроется противоположный ордер. Если так можно сделать то почему в этом коде не получается ? if(NewBar()==true) { cluch_buy=false; cluch_sell=false; } //double ma=iMA(NULL,0,Ma_Period,0,MODE_SMMA,PRICE_MEDIAN,0); //double ma1=iMA(NULL,0,Ma_Period,0,MODE_SMMA,PRICE_MEDIAN,1); double rsi1=iRSI(Symbol(),0,RSI1,PRICE_CLOSE,0); double rsi2=iRSI(Symbol(),0,RSI1,PRICE_CLOSE,1); //double rsi3=iRSI(Symbol(),0,RSI2,PRICE_CLOSE,0); //double rsi4=iRSI(Symbol(),0,RSI2,PRICE_CLOSE,1); if(rsi1>s1 && rsi2<s1) if(cluch_buy==false) { ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,slipp,0,0,"My order",Magic,0,clrBlue); if(ticket<0) { Print("OrderSend завершилась с ошибкой #",GetLastError()); } else Print("Функция OrderSend успешно выполнена"); cluch_buy=true; cluch_sell=false; } if(rsi1<s1 && rsi2>s1) if(cluch_sell==false) { ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,slipp,0,0,"My order",Magic,0,clrRed); if(ticket<0) { Print("OrderSend завершилась с ошибкой #",GetLastError()); } else Print("Функция OrderSend успешно выполнена"); cluch_sell=true; cluch_buy=false; } }

Scriptong: bro пишет: Здравствуйте. Интересует вопрос: можно ли на нулевом баре гарантированно открывать ордера. Допустим если уже есть Бай, то при состоянии "индикатор ниже уровня" гарантированно откроется противоположный ордер. Если так можно сделать то почему в этом коде не получается ? Чтобы ответить на этот вопрос, нужно видеть весь код. А здесь лишь кусок кода. В нем по поводу вопроса все нормально. Разве что заметьте, что существует функция NewBar(), которая по содержанию должна срабатывать только один раз на бар. А это влечет за собой отсутствие сброса флага cluch_buy.

bro: Scriptong пишет: Чтобы ответить на этот вопрос, нужно видеть весь код. А здесь лишь кусок кода. В нем по поводу вопроса все нормально. Разве что заметьте, что существует функция NewBar(), которая по содержанию должна срабатывать только один раз на бар. А это влечет за собой отсутствие сброса флага cluch_buy. Да проверка на баре не походит. Код исполняется внутри бара. Что с чем сравнивать для корректной работы приведенной части кода ?

Scriptong: bro пишет: Да проверка на баре не походит. Код исполняется внутри бара. Что с чем сравнивать для корректной работы приведенной части кода ? К сожалению, не могу сказать. Нужно видеть всю логику. Иначе буду лишь гадать.

bro: Здравствуйте. Как прописать в коде, чтобы закрытие, открытие ордера происходило не на новом(0) баре, а на первом ? Например есть открытый ордер Бай, нарисовалась медвежья свеча и в момент, по факту закрытия этой(а не открытия новой) свечи, закрываем ордер. Время, не должно иметь значения. Закрытие текущего бара, не должно сопоставляться с открытием нового. Пусть, даже это не грамотно и убыточно, с точки зрения программирования, или торговли. Можно пример кода ?

Scriptong: bro пишет: Здравствуйте. Как прописать в коде, чтобы закрытие, открытие ордера происходило не на новом(0) баре, а на первом ? Например есть открытый ордер Бай, нарисовалась медвежья свеча и в момент, по факту закрытия этой(а не открытия новой) свечи, закрываем ордер. Время, не должно иметь значения. Закрытие текущего бара, не должно сопоставляться с открытием нового. Пусть, даже это не грамотно и убыточно, с точки зрения программирования, или торговли. Если нужно, чтобы по окончании свечи закрывался ордер, открытый на ней, то так: // Выбрать ордер (по тикету или по индексу) ... // ~-------------- if (OrderOpenTime() >= iOpen(NULL, 0, 0)) return; // или continue, если все это в цикле if (OrderType() == OP_BUY && iOpen(NULL, 0, 1) > iClose(NULL, 0, 1)) { // закрыть ордер } if (OrderType() == OP_SELL && iOpen(NULL, 0, 1) < iClose(NULL, 0, 1)) { // закрыть ордер }

bro: Scriptong пишет: Если нужно, чтобы по окончании свечи закрывался ордер, открытый на ней, то так: Нет, не на ней, на другой свече.

Scriptong: bro пишет: Нет, не на ней, на другой свече. Значит, увеличьте индексы во всех функциях iOpen и iClose на столько баров, сколько требуется.

Evgeny: Доброго времени, Игорь! Подобный вопрос наверное раз в сотый Вам задают... Открывается ордер при выполнении условий... например { if (RSI12_2>50 && RSI12_1<50) { OrderSend(Symbol(),OP_SELL,1.0,Bid,3,Bid+SL*Point,0,"",1,0,CLR_NONE); } } Это происходит на часовом таймфрейме.... Ордер, к примеру, через 10 минут закрывается по стопу, т.е. внутри часового бара. Сразу открывается новый, потому что условие для открытия ордера выполняется пока не закончится час. Снова закрывается с убытком и снова открывается новый... Что добавить в код, чтобы открывался в течение бара (часа) только один ордер. Если он закроется с убытком, то новый бы не открывался? Может функция sleep? Подскажите пожалуйста.

Scriptong: Evgeny пишет: Ордер, к примеру, через 10 минут закрывается по стопу, т.е. внутри часового бара. Сразу открывается новый, потому что условие для открытия ордера выполняется пока не закончится час. Снова закрывается с убытком и снова открывается новый... Что добавить в код, чтобы открывался в течение бара (часа) только один ордер. Если он закроется с убытком, то новый бы не открывался? Если планируется открывать только один ордер на свече, то перед открытием ордера нужно проверить, открывался ли ордер на этой свече. Для этого необходимо обратиться к истории счета и найти там ордер эксперта, открытый позднее заданного времени: bool IsOrderOpenedLaterThanSpecifiedTime(datetime dtTime) { for (int i = OrdersHistoryTotal() - 1; i >= 0; --i) { if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; if (OrderSymbol() != Symbol()) continue; if (OrderOpenTime() >= dtTime) return true; } return false; } Использование: if (!IsOrderOpenedLaterThanSpecifiedTime(iTime(NULL, 0, 0))) { // Можно открывать ордер }



полная версия страницы