Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Это очень неправильно ...
OrderSelect(BuyTicket || SellTicket, SELECT_BY_TICKET);
(BuyTicket || SellTicket) приведет к true или false ... и в этом случае true или false будет рассматриваться как 1 или 0 ... а не как число SellTicket или Buyticket ....
Stoploss = 40 ... ... когда вы используете стоплосс в OrderSend, это цена ... а не количество пунктов, проскальзывание - это количество пунктов ... читайте документацию: OrderSend
Хорошо, я понял, что вы имеете в виду, поэтому мне нужна команда для выбора ордера при использовании OrderSelect... или OrderSelect в этом случае вообще неверен?
Прочитайте документацию... OrderSelect необходим для выбора ордера, прежде чем вы сможете использовать такие функции, как OrderLots, OrderTicket, OrderOpenPrice и т.д. и т.п. "Примечание: Ордер должен быть предварительно выбран функциейOrderSelect() ".
Если вам не нужно использовать информацию, относящуюся к существующему ордеру, вам не нужен OrderSelect. Если нужен... ну тогда нужен.
Прочитайте документацию... OrderSelect необходим для выбора ордера, прежде чем вы сможете использовать такие функции, как OrderLots, OrderTicket, OrderOpenPrice и т.д. и т.п. "Примечание: Ордер должен быть предварительно выбран функциейOrderSelect() ".
Если вам не нужно использовать информацию, относящуюся к существующему ордеру, вам не нужен OrderSelect. Если нужен... что ж, тогда нужен.
В настоящее время я думаю, что мне нужна эта информация, потому что если есть позиция на рынке, мне нужно закрыть ее и заменить на другую. Я думал, что OrderSelect поможет мне в этом. Но если Orderselect будет только для открытых ордеров, а не для активной позиции на рынке, то это будет бесполезно. Я прав?
Но если OrderSelect не помогает, как я могу закрыть активные позиции?
с уважением,
Марк
nirvanamac:
Кажется, что все в основном правильно, но теперь мне нужно знать, почему прога выполняет только ордер на продажу @ 12 и 23... а не ордера на покупку...?
Вероятно, да... и, вероятно, генерирует ошибку, которую вы не отлавливаете...
Попробуйте...
Ваш OrderClose неправильный ... вы открываете Buy на Ask, чтобы закрыть Buy вы Sell ... вы Sell на Bid, вы открываете Sell на Bid, чтобы закрыть Sell вы Buy ... вы Buy на Ask.
Ваш OrderClose неправильный ... вы открываете Buy по Ask, чтобы закрыть Buy вы Sell ... вы Sell по Bid, вы открываете Sell по Bid, чтобы закрыть Sell вы Buy ... вы Buy по Ask.
Большое спасибо за помощь... Я изменил код с помощью ваших подсказок. Выглядит это следующим образом:
//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"
//Wichtige Variablen
extern double Minlot=0.01;
extern int Digits2Round=2;
extern int PercentOfFreeDepo=1;
extern int Slippage=5;
extern int MagicNumber=1;
extern int TradeHour3=3;
extern int TradeHour4=4;
extern int TradeHour7=7;
extern int TradeHour10=10;
extern int TradeHour17=17;
extern int TradeHour18=18;
extern int TradeHour20=20;
extern int TradeHour12=12;
extern int TradeHour23=23;
extern int StopLoss=400;
//Globale Variablen
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;
int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| функция инициализации эксперта |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}
//+------------------------------------------------------------------+
//| функция запуска эксперта |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== Позволяет определить размер лота и риск ===================================
if ( Lot<Minlot )
{
Lot=Minlot;
}
Comment("\n", "Приемлемый риск составляет ",PercentOfFreeDepo,"% = ",Risk, "свободных денег ",FreeDepo, "в лотах = ",Lot);
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if((OrderOpenTime()+3600) < TimeCurrent())
{
if (OrderType() == OP_BUY || OP_SELL)
{
bool Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red);
openbuy = 0;
opensell = 0;
}
if (OrderType() == OP_SELL)
{
Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red);
opensell = 0;
openbuy = 0;
}
}
}
}
//BuyOrder
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Сигнал на покупку
{
openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,Ask - StopLoss * Point,0, "time trader buy order ",MagicNumber,0,Blue);
if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0, "time trader sell order ",MagicNumber,0,Green);
if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );
}
//----
return(0);
}
//+------------------------------------------------------------------+
//Функция точки пипсовки
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return (CalcPoint);
}
//Получение функции проскальзывания
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return (CalcSlippage);
}
При выполнении бэктеста возникает одно сообщение об ошибке ERR_INVALID_TICKET (4108).
Не все ордера были выполнены
Может ли быть, что ошибка связана с тем, что SL был запущен раньше?