Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 815

 
evillive:


Вот тут сначала рассматривается тип ордера, а уже потом этот ордер выбран, вобще-то должно быть наоборот, сначала выбрать ордер, а уже если ордер выбран - смотреть его тип и по-всякому над ним глумиться:

так вот:

if(R==1)//238

{

 Alert("yes");

 R=0;

 SelectBuy=OrderSelect(OrderTicketBuy,SELECT_BY_TICKET);

}


if(R==2)//245

{

 Alert("yes");

 R=0;

 SelectSell=OrderSelect(OrderTicketSell,SELECT_BY_TICKET);

}

 

И в "свитче-который-типа-тралит-стоплосс"( =D. Что Вам не нравиться? По моему норм вариант, очень наглядно.   ), почему именно continue везде??? И когда будет исполнена вот эта строчка, в одном и во втором свитче? 

 Так он пробьется по условию:

 Timen=OrderCloseTime();

 if(Timen>0)

 {

  DeleteSell=OrderDelete(OrderTicketSell);

  OldProfit=0;

  WarBuy=true;

  break;

 }

 Ну  вообще да, break будет лучше смотреться в строке OrderClose. Тогда нужно будет еще прописать OrderDelete.

 

evillive:

Дам ещё подсказок.

Вот этот цикл рассматривает не все ордера, кроме того, если ордеров одного типа больше, чем один (например, выставлено три ордера байстоп), то что тогда будет?

 OrdersTotal от 1 идет, а OrderSelect от 0. Все верно. 

Больше одного ордера одного типа на 1 фин инструменте? Исключено. Но посмотрю еще.

 

 Нужно условие максимально приближенное к этому: "если MA==цене, то".

Такое  пойдет:

if((MA>Open[0] && MA<Close[0]) || (MA<Open[0] && MA>Open[0]))

  

 

 

P.S.: С Новым годом! 

 
Кому-то и новый год не Новый год. С Новым годом!!!
 

С Новым годом!

Недавно начал изучение MQL 4 и хотел задать вопрос:

Например у меня  есть условие открытия ордера:

 if (Bid>=SS+5*Point)

  OrderSend(Symbol(),OP_BUY,Lot,Ask,10,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,Green);

Теперь собственно вопрос : какое нужно прописать условие для открытия второго ордера в случае если у первого ордера прибыль  10 пунктов и более?

[Удален]  
lexdemon:

С Новым годом!

Недавно начал изучение MQL 4 и хотел задать вопрос:

Например у меня  есть условие открытия ордера:

 if (Bid>=SS+5*Point)

  OrderSend(Symbol(),OP_BUY,Lot,Ask,10,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,Green);

Теперь собственно вопрос : какое нужно прописать условие для открытия второго ордера в случае если у первого ордера прибыль  10 пунктов и более?

Поищите здесь, там множество функций почти на все случаи.

https://www.mql5.com/ru/forum/131859

 
lexdemon:

С Новым годом!

Недавно начал изучение MQL 4 и хотел задать вопрос:

Например у меня  есть условие открытия ордера:

 if (Bid>=SS+5*Point)

  OrderSend(Symbol(),OP_BUY,Lot,Ask,10,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,Green);

Теперь собственно вопрос : какое нужно прописать условие для открытия второго ордера в случае если у первого ордера прибыль  10 пунктов и более?

Предварительно выбрав ордер OrderSelect (Тикет_первого_ордера, SELECT_BY_TICKET);

     if(OrderOpenPrice()+10*Point==Ask)

 OrderSend(Symbol(),OP_BUY,Lot,Ask,10,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,Green);

 
CJIeCaPb

 Нужно условие максимально приближенное к этому: "если MA==цене, то".

Такое  пойдет:

if((MA>Open[0] && MA<Close[0]) || (MA<Open[0] && MA>Open[0]))


Ура, заработало кажется. Вставил в каждый цикл return и оператор "O" чтобы не проходил не нужные операции. 

Одна проблема: ордера выставляет криво - не знаю как сформулировать условие.

Файлы:
test3.mq4  16 kb
[Удален]  

здравствуйте,  раньше задавал тут вопрос такой, сказали что проблема в трейдере.  в тех поддержке сказали что это проблема в терминале.  гляньте нет ли у вас такой же неприятности в метатрейдере 4. трейдер у меня форексстарт , если это имеет роль.

суть в чем, я написал торгового робота , который работает по минутному графику. он анализирует историю. на многих графиках история предоставляется где-то примерно на полтора месяца и больше нет, хотя на часовом - дневном - годичном графике история есть. есть еще такие случаи когда возвращает по определенную дату, далее обрыв, и граффик продолжается спустя пару месяцев назад, хотя на графиках повыше опять все есть.

как можно с этим бороться?


 
pycha:

здравствуйте,  раньше задавал тут вопрос такой, сказали что проблема в трейдере.  в тех поддержке сказали что это проблема в терминале.  гляньте нет ли у вас такой же неприятности в метатрейдере 4. трейдер у меня форексстарт , если это имеет роль.

суть в чем, я написал торгового робота , который работает по минутному графику. онанализирует историю. на многих графиках история предоставляется где-топримерно на полтора месяца и больше нет, хотя на часовом - дневном -годичном графике история есть. есть ещетакие случаи когда возвращает по определенную дату, далее обрыв, играффик продолжается спустя пару месяцев назад, хотя на графиках повышеопять все есть.

как можно с этим бороться?


Если спустя несколько циклов удаления - скачивания истории с сервера ДЦ разрывы всё ещё есть, значит такую историю они вам предоставлют. Гуглите Tickstory Lite и готовьте много места на диске для тиковой истории, потом скармливаете эту историю тестеру и будет вам М1 за десяток лет или больше.
[Удален]  

какраз эксперементировал с "архивом котировок"  . обновляя для каждого графика отдельно историю добился что почти для всех графиков все начало работать корректно, за исключением нескольких экзотических пар, на них по паре раз удалял обновлял - нет новых данных для графика. в общем можно сказать вопрос решен


спасибо за оперативность))))

 

Уважаемые программисты...возникла проблема...создал советник...он открывает сделки нормально(в тестере)....но вот закрывает только сделки на покупку...на продажу он закрывает только по заверении тестирования... вот кусок кода....может вы мне поможете... 

 

 

//---------------------------------------------------------------------------------------------------------

void CloseSell() 

{

   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 

   {

      if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) == true) 

      {   

      if (OrderSymbol() == Symbol()) 

         {

            if (OrderMagicNumber() == Magic && OrderType() == OP_SELL) 

               OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Green);

         }

      }

   }

}

//+------------------------------------------------------------------+

void CloseBuy() 

{

   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 

   {

      if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) == true)

      {

         if (OrderSymbol() == Symbol()) 

         {

            if (OrderMagicNumber() == Magic && OrderType() == OP_BUY) 

               OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Green);

         }

      }

   }

}

//+------------------------------------------------------------------+

void OpenSellOrder()

{

   mlots = GetLots();

   

   if (AutoSL) sl = CalcSL(OP_SELL);

   else sl = ND(Bid - StopLoss*Point);

   

   tp = ND(Bid - TakeProfit*Point);

   

   ticket = OrderSendReliable(Symbol(), OP_SELL,  mlots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);

   if(ticket > 0)

      OrderModifyReliable(OrderTicket(), OrderOpenPrice(), sl, tp, 0);


}

//+------------------------------------------------------------------+

int OpenBuyOrder()

{

   mlots = GetLots();

   

   if (AutoSL) sl = CalcSL(OP_BUY);

   else sl = ND(Bid - StopLoss*Point);


   tp = ND(Ask + TakeProfit*Point);


   ticket = OrderSendReliable(Symbol(), OP_BUY,  mlots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);

   if(ticket > 0)

      OrderModifyReliable(OrderTicket(), OrderOpenPrice(), sl, tp, 0);

}

//+------------------------------------------------------------------+

void ModifyLoss()

{

   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 

   {

      if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) == true)

      {

         if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;

         if (OrderType() == OP_BUY)

         {

            sl = ND(OrderOpenPrice() + LossPoints*Point);

            if (OrderStopLoss() < sl && (Ask - OrderOpenPrice())/Point >= LossLimit)

            {

               if (sl != ND(OrderStopLoss()))

                  OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0);

            }

         } 

         else

         if (OrderType() == OP_SELL)

         {

            sl = ND(OrderOpenPrice() - LossPoints*Point);

            if (OrderStopLoss() > sl && (OrderOpenPrice()-Bid)/Point >= LossLimit)

            {

               if (sl != ND(OrderStopLoss()))

                  OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0);

            }

         }

      }

   }

}

//+------------------------------------------------------------------+

double CalcSL(int otype)

{

   double sloss = 10000000;

   

   if (otype == OP_BUY)

   {

      double min;

      for (int i=1; i<=SLBars; i++) 

      {

         min = iLow(NULL, 0, i);

         if (min < sloss)

            sloss = min;

      }

      

      sloss = ND(sloss - SLPips*Point);

      if ((Ask-sloss)/Point < MinSL)

         sloss = ND(Ask - MinSL*Point);

             

      if ((Ask - sloss)/Point > MaxSL)

         sloss = ND(Ask - MaxSL*Point);

      else 

         sloss = ND(sloss - SLPips*Point);


      return(sloss);

   }

   else

   if (otype == OP_SELL)

   {

      double max;

      sloss = 0;

      

      for (i=1; i<=SLBars; i++) 

      {

         max = iHigh(NULL, 0, i);

         if (max > sloss)

            sloss = max;

      }

      

      if ((sloss - Bid)/Point < MinSL)

         sloss = ND(Bid + MinSL*Point);

          

      if ((sloss - Bid)/Point > MaxSL)

         sloss = ND(Bid + MaxSL*Point);

      else

         sloss = ND(sloss + SLPips*Point); 


      return(sloss);

   }

   return(0);

}

//+------------------------------------------------------------------+

double GetLots()

{

   if (!UseMM) return(FixLot);


   double clots;

   clots = AccountBalance()    / 10000.0 * LotsFor10000;

   clots = MathMax(clots, MarketInfo(Symbol(), MODE_MINLOT));

   clots = MathMin(clots, MarketInfo(Symbol(), MODE_MAXLOT));

   clots = NormalizeDouble(clots, 2);

   return (clots);

}

//+------------------------------------------------------------------+

int CountBuy() 

{

   int count = 0;

   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 

   {

      if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)

             count++;

      }

   }

   return (count);

}

//+------------------------------------------------------------------+

int CountSell() 

{

   int count = 0;

   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 

   {

      if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)

             count++;

      }

   }

   return (count);

}

//+------------------------------------------------------------------+

int CountTrades()

{

   return(CountBuy() + CountSell()); 

}

//+------------------------------------------------------------------+

double ND(double value)

{

   return (NormalizeDouble(value, Digits));