Группа "Стол заказов MQL"

Рейтинг 2086



РЕКОМЕНДУЮ




Лучшее от vic123



чудо! Комментариев 51
2016-10-01 08:35:13Рейтинг 0

С Новым Годом Вас ВСЕХ!!!!! Комментариев 4
2016-12-31 22:18:26Рейтинг 0

Нужна помощь
2021-08-03 09:58:14Рейтинг 0

Доработка советника Комментариев 2
2016-02-21 10:24:52Рейтинг 0

Модернизация советника Комментариев 19
2015-05-21 05:59:31Рейтинг 0

ПОДСКАЖИТЕ, PLEASE

КАК РЕАЛИЗОВАТЬ ЭТО ЧЕРЕЗ FOR

if (OrdTotalBuy()==1) Mnog1 = Mnog;
if (OrdTotalBuy()==2) Mnog1 = Mnog+0.05;
if (OrdTotalBuy()==3) Mnog1 = Mnog+0.1;
if (OrdTotalBuy()==4) Mnog1 = Mnog+0.15;
if (OrdTotalBuy()==5) Mnog1 = Mnog+0.2;
if (OrdTotalBuy()==6) Mnog1 = Mnog+0.25;
if (OrdTotalBuy()==7) Mnog1 = Mnog+0.3;
if (OrdTotalBuy()==8) Mnog1 = Mnog+0.35;
if (OrdTotalBuy()==9) Mnog1 = Mnog+0.4;
if (OrdTotalBuy()==10) Mnog1 = Mnog+0.45;
if (OrdTotalBuy()==11) Mnog1 = Mnog+0.5;
if (OrdTotalBuy()==12) Mnog1 = Mnog+0.55;
if (OrdTotalBuy()==13) Mnog1 = Mnog+0.6;
if (OrdTotalBuy()==14) Mnog1 = Mnog+0.65;
  • +1
  • Просмотров: 3236
  • 13 марта 2016, 15:27
  • vic123
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Скрипт FIBO процент от цены
Следующая запись в группе  
Пожалуйста напишите советник.
13 марта 2016
14 марта 2016

Комментарии (21)

+
0
это надо через switch реализовывать, for не имеет смысла, вы же не подсчитываете сумму в следующих итерациях

например так:

double GetMnog(int ord){
switch(ord){
case 1: return Mnog;
case 2: return Mnog+0.05;
и т.д.

}
return 0;
}

Редактирован: 13 марта 2016, 15:38
avatar

  2  DKeN Сообщений: 38 - Александр Гаврилин

  • 13 марта 2016, 15:36
+
0
Дело в том что при тестировании программы выяснилось что может открыться до 35 ордеров. Не описывать же их все в форме первоначальной
avatar

  19  vic123 Автор Сообщений: 98

  • 13 марта 2016, 15:45
+
0
черкните мне в скайп, поясню как лучше сделать т.к. я не вижу всей ситуации мне сложно точно вам ответить на ваш вопрос.
avatar

  2  DKeN Сообщений: 38 - Александр Гаврилин

  • 13 марта 2016, 15:47
+
0
DKeN, вы же утверждали, что профессионально код пишите. Какой switch? Вы о чем? Эта легкая задачка решается в одну строчку.

P.S. Ниже решение привела.
Редактирован: 13 марта 2016, 19:27
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 13 марта 2016, 19:20
+
0
все очень просто, для меня задача не была поставлена полностью, когда не видно всего кода, и за что отвечает Mnog, Mnog1. Поэтому я не увидел логики и необходимости в цикле для решения такой задачи или иного способа описанного ниже.

Исходная задача была поставлена как:
КАК РЕАЛИЗОВАТЬ ЭТО ЧЕРЕЗ FOR
Редактирован: 13 марта 2016, 20:28
avatar

  2  DKeN Сообщений: 38 - Александр Гаврилин

  • 13 марта 2016, 20:26
+
0
:D  неа, такой ответ не прокатит :D 
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 13 марта 2016, 20:31
+
0
*bravo* 
avatar

  2  DKeN Сообщений: 38 - Александр Гаврилин

  • 13 марта 2016, 20:32
+
0
ПОДСКАЖИТЕ, КАК РЕАЛИЗОВАТЬ ЭТО ЧЕРЕЗ switch
avatar

  19  vic123 Автор Сообщений: 98

  • 13 марта 2016, 15:40
+
0
как узнать Ваш скайп?
avatar

  19  vic123 Автор Сообщений: 98

  • 13 марта 2016, 15:54
+
0
double GetMnog(int ord){
switch(ord){
case 1: return Mnog;
case 2: return Mnog+0.05;
и т.д.

}
return 0;
}

это практически то же самое что и мой первоначальный вариант.
все таки эта функция должна реализоваться на for или while.
avatar

  19  vic123 Автор Сообщений: 98

  • 13 марта 2016, 16:17
+
0
А так?

if (OrdTotalBuy()==1) Mnog1 = Mnog;
if (OrdTotalBuy()==2) Mnog1 = Mnog+0.05;
if (OrdTotalBuy()==3) Mnog1 = Mnog+0.1; 
if (OrdTotalBuy()==4) Mnog1 = Mnog+0.15;

if(OrdTotalBuy()>0) Mnog1 = Mnog+0.05*(OrdTotalBuy()-1);
avatar

  34  AM2 Сообщений: 15878 - Андрей

  • 13 марта 2016, 16:34
+
0
Может такой вариант Вам поможет:

extern double     Lot               = 0.1;   //Начальный лот
extern double     ShagLot           = 0.05;  //прогрессия лота
extern int        MaxOrd            = 35;    //Максимум ордеров
extern double     MaxLot            = 10;    //Максимальный лот

int PrevOrdTotalBuy=0;
//+-------------------------------------------------------------+//
double BuyLotsOptimized()
  {
   double LotSize=MarketInfo(Symbol(),MODE_LOTSIZE);
   double MinLot=MarketInfo(Symbol(),MODE_MINLOT);
   double lot=Lot;

   if(OrdTotalBuy()>PrevOrdTotalBuy && OrdTotalBuy()<=MaxOrd)
     {
      lot += ShagLot*(OrdTotalBuy()-1);
      if(lot<=MinLot) lot=MinLot;
      if(lot>=MaxLot) lot=MaxLot;
     }
return (lot);
  }

Редактирован: 13 марта 2016, 18:08
avatar

  18  Andrju81 Сообщений: 245 - Андрей

  • 13 марта 2016, 17:49
+
+6
РЕБЯТА! Все решается в одну строчку! Без if, for или switch
Mnog1 = Mnog + (OrdTotalBuy()-1)*0.05;


Конечно, лучше проверить, есть ли вообще ордера. Тогда будет так.
int _ordTotalBuy = OrdTotalBuy();
if(_ordTotalBuy>0) Mnog1 = Mnog + (_ordTotalBuy-1)*0.05;


А совсем грамотно вынести 0.05 в отдельную переменную.
double _rate = 0.05;
int _ordTotalBuy = OrdTotalBuy();
if(_ordTotalBuy>0) Mnog1 = Mnog + (_ordTotalBuy-1)*_rate;

Редактирован: 13 марта 2016, 19:26
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 13 марта 2016, 19:06
+
+2
*good*  *bravo* 
avatar

  13  Fargo Сообщений: 495

  • 13 марта 2016, 19:53
+
0
Спасибо всем!!!
Может быть поможете и с моим топиком от 1 марта. В принципе я практически со все разобрался сам, но стрелки при модификации отложек забивают график и очень трудно найти среди них рыночный ордер. Посмотрите пожалуйста советник cm_ea_news, может можно как то избавиться от этих стрелок в процессе тестирования.
С уважением!!!
avatar

  19  vic123 Автор Сообщений: 98

  • 14 марта 2016, 07:38
+
0
В принципе я практически со все разобрался сам, но стрелки при модификации отложек забивают график и очень трудно найти среди них рыночный ордер.


Покажите что убрать на скрине? Обычно так убирается все ObjectsDeleteAll(),
так ObjectsDeleteAll(0,OBJ_ARROW) стрелки и по имени объекта


string name=ObjectName(i);
ObjectDelete(name);
avatar

  34  AM2 Сообщений: 15878 - Андрей

  • 14 марта 2016, 08:35
+
0

После модификации отложек, сраэу же удалять стрелки, появляющиеся на графике после модификации.
avatar

  19  vic123 Автор Сообщений: 98

  • 14 марта 2016, 08:53
+
0
После модификации отложек, сраэу же удалять стрелки, появляющиеся на графике после модификации.

Пробуйте 3 варианта выше или кидайте код я посмотрю.
avatar

  34  AM2 Сообщений: 15878 - Андрей

  • 14 марта 2016, 09:17
+
0
//+------------------------------------------------------------------+
//|                              Copyright © 2014, Khlystov Vladimir |
//|                                         http://cmillion.narod.ru |
//+------------------------------------------------------------------+
//#property copyright "Copyright © 2014, cmillion@narod.ru"
//#property link      "http://cmillion.ru"
//#property strict
//#property description "Советник торгует на скачках рынка, при этом не использует никакие индикаторы."
//#property description "Идея советника заключается в том, что стоп ордера дискретно времени перемещаются на заданном расстоянии от текущей цены."
//#property description "Если цена достаточно резко поползла в одну сторону, то советник просто не успевает переместить ордер и он становится рыночным."
//#property description "Далее включается тралл ордера."
 //--------------------------------------------------------------------
extern int     Stoploss             = 10,     //стоплосс, если 0 то не изменяется
               Takeprofit           = 50;     //тейкпрофит, если 0 то не изменяется
extern int     TrailingStop         = 10;     //длинна тралла, если 0 то нет тралла
extern int     TrailingStart        = 0;      //когда включать тралл, например после достижения 40 п прибыл
extern int     StepTrall            = 2;      //шаг тралла - перемещать стоплосс не ближе чем StepTrall
extern int     NoLoss               = 0,      //перевод в безубыток при заданном кол-ве пунктов прибыли, если 0 то нет перевода в безубыток
               MinProfitNoLoss      = 0;      //минимальная прибыль при переводе вбезубыток
extern int     Magic                = 77;     //магик
extern int     Step                 = 10;     //расстояние от цены
extern double  Lot                  = 0.1;
extern int     TimeModify           = 30;     //кол-во секунд раньше которого запрещено изменять ордер
extern int     slippage             = 30;     //Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).
//--------------------------------------------------------------------
datetime  TimeBarB,TimeBarS;
//--------------------------------------------------------------------
int start()                                  
{
   double STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   double OSL=0,StLo=0,PriceB=0,PriceS=0,OOP=0,SL=0,TP=0;
   int b=0,s=0,TicketB=0,TicketS=0,OT;
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
         { 
            OT = OrderType(); 
            OSL = NormalizeDouble(OrderStopLoss(),Digits);
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
            SL=OSL;
            if (OT==OP_BUY)             
            {  
               b++;
               if (OSL<OOP && NoLoss!=0)
               {
                  StLo = NormalizeDouble(OOP+MinProfitNoLoss*Point,Digits); 
                  if (StLo > OSL && StLo <= NormalizeDouble(Bid - STOPLEVEL * Point,Digits)) SL = StLo;
               }
               
               if (TrailingStop>=STOPLEVEL && TrailingStop!=0 && (Bid - OOP)/Point >= TrailingStart)
               {
                  StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits); 
                  if (StLo>=OOP && StLo > OSL+StepTrall*Point) SL = StLo;
               }
               
               if (SL > OSL)
               {  
                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,0)) Print("Error ",GetLastError(),"   Order Modify Buy   SL ",OSL,"->",SL);
                  else Print("Order Buy Modify   SL ",OSL,"-",SL);
               }
            }                                         
            if (OT==OP_SELL)        
            {
               s++;
               if ((OSL>OOP || OSL==0) && NoLoss!=0)
               {
                  StLo = NormalizeDouble(OOP-MinProfitNoLoss*Point,Digits); 
                  if ((StLo < OSL || OSL==0) && StLo >= NormalizeDouble(Ask + STOPLEVEL * Point,Digits)) SL = StLo;
               }
               
               if (TrailingStop>=STOPLEVEL && TrailingStop!=0 && (OOP - Ask)/Point >= TrailingStart)
               {
                  StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits); 
                  if (StLo<=OOP && (StLo < OSL-StepTrall*Point || OSL==0)) SL = StLo;
               }
               
               if ((SL < OSL || OSL==0) && SL!=0)
               {  
                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,0)) Print("Error ",GetLastError(),"   Order Modify Sell   SL ",OSL,"->",SL);
                  else Print("Order Sell Modify   SL ",OSL,"-",SL);
               }
            } 
            if (OT==OP_BUYSTOP)  {PriceB=OOP; TicketB=OrderTicket();}     
            if (OT==OP_SELLSTOP) {PriceS=OOP; TicketS=OrderTicket();}  
         }
      }
   }
   if (b+TicketB==0)
   {
      if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Bid - Stoploss * Point,Digits); else SL=0;
      if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Ask + Takeprofit * Point,Digits); else TP=0;
      if (OrderSend(Symbol(),OP_BUYSTOP,Lot,NormalizeDouble(Ask+Step * Point,Digits),slippage,SL,TP,"news",Magic,0,0)!=-1) TimeBarB=TimeCurrent();
   } 
   if (s+TicketS==0)
   {
      if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Ask + Stoploss * Point,Digits); else SL=0;
      if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Bid - Takeprofit * Point,Digits); else TP=0;
      if (OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid - Step * Point,Digits),slippage,SL,TP,"news",Magic,0,0)!=-1) TimeBarS=TimeCurrent();
   } 
   if (TicketB!=0)
   {
      if (TimeBarB<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Ask + Step * Point,Digits)-PriceB)/Point>StepTrall)
      {
         if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Bid - Stoploss * Point,Digits); else SL=0;
         if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Ask + Takeprofit * Point,Digits); else TP=0;
         if (OrderModify(TicketB,NormalizeDouble(Ask + Step * Point,Digits),SL,TP,0,0)) TimeBarB=TimeCurrent();
      }
   } 
   if (TicketS!=0)
   {
      if (TimeBarS<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Bid - Step * Point,Digits)-PriceS)/Point>StepTrall)
      {
         if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Ask + Stoploss * Point,Digits); else SL=0;
         if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Bid - Takeprofit * Point,Digits); else TP=0;
         if (OrderModify(TicketS,NormalizeDouble(Bid - Step * Point,Digits),SL,TP,0,0)) TimeBarS=TimeCurrent();
      }
   } 
return(0);
}
//--------------------------------------------------------------------
avatar

  19  vic123 Автор Сообщений: 98

  • 14 марта 2016, 09:19
+
0
Ага?


//+------------------------------------------------------------------+
//|                              Copyright © 2014, Khlystov Vladimir |
//|                                         http://cmillion.narod.ru |
//+------------------------------------------------------------------+
//#property copyright "Copyright © 2014, cmillion@narod.ru"
//#property link      "http://cmillion.ru"
//#property strict
//#property description "Советник торгует на скачках рынка, при этом не использует никакие индикаторы."
//#property description "Идея советника заключается в том, что стоп ордера дискретно времени перемещаются на заданном расстоянии от текущей цены."
//#property description "Если цена достаточно резко поползла в одну сторону, то советник просто не успевает переместить ордер и он становится рыночным."
//#property description "Далее включается тралл ордера."
//--------------------------------------------------------------------
extern int     Stoploss             = 10,     //стоплосс, если 0 то не изменяется
Takeprofit           = 50;     //тейкпрофит, если 0 то не изменяется
extern int     TrailingStop         = 10;     //длинна тралла, если 0 то нет тралла
extern int     TrailingStart        = 0;      //когда включать тралл, например после достижения 40 п прибыл
extern int     StepTrall            = 2;      //шаг тралла - перемещать стоплосс не ближе чем StepTrall
extern int     NoLoss               = 0,      //перевод в безубыток при заданном кол-ве пунктов прибыли, если 0 то нет перевода в безубыток
MinProfitNoLoss      = 0;      //минимальная прибыль при переводе вбезубыток
extern int     Magic                = 77;     //магик
extern int     Step                 = 10;     //расстояние от цены
extern double  Lot                  = 0.1;
extern int     TimeModify           = 30;     //кол-во секунд раньше которого запрещено изменять ордер
extern int     slippage             = 30;     //Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).
//--------------------------------------------------------------------
datetime  TimeBarB,TimeBarS;
//--------------------------------------------------------------------
int start()
  {
   ObjectsDeleteAll(0,OBJ_ARROW);
   ObjectsDeleteAll(0,OBJ_TREND);
   double STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   double OSL=0,StLo=0,PriceB=0,PriceS=0,OOP=0,SL=0,TP=0;
   int b=0,s=0,TicketB=0,TicketS=0,OT;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
           {
            OT=OrderType();
            OSL = NormalizeDouble(OrderStopLoss(),Digits);
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
            SL=OSL;
            if(OT==OP_BUY)
              {
               b++;
               if(OSL<OOP && NoLoss!=0)
                 {
                  StLo=NormalizeDouble(OOP+MinProfitNoLoss*Point,Digits);
                  if(StLo>OSL && StLo<=NormalizeDouble(Bid-STOPLEVEL*Point,Digits)) SL=StLo;
                 }

               if(TrailingStop>=STOPLEVEL && TrailingStop!=0 && (Bid-OOP)/Point>=TrailingStart)
                 {
                  StLo=NormalizeDouble(Bid-TrailingStop*Point,Digits);
                  if(StLo>=OOP && StLo>OSL+StepTrall*Point) SL=StLo;
                 }

               if(SL>OSL)
                 {
                  if(!OrderModify(OrderTicket(),OOP,SL,TP,0,0)) Print("Error ",GetLastError(),"   Order Modify Buy   SL ",OSL,"->",SL);
                  else Print("Order Buy Modify   SL ",OSL,"-",SL);
                 }
              }
            if(OT==OP_SELL)
              {
               s++;
               if((OSL>OOP || OSL==0) && NoLoss!=0)
                 {
                  StLo=NormalizeDouble(OOP-MinProfitNoLoss*Point,Digits);
                  if((StLo<OSL || OSL==0) && StLo>=NormalizeDouble(Ask+STOPLEVEL*Point,Digits)) SL=StLo;
                 }

               if(TrailingStop>=STOPLEVEL && TrailingStop!=0 && (OOP-Ask)/Point>=TrailingStart)
                 {
                  StLo=NormalizeDouble(Ask+TrailingStop*Point,Digits);
                  if(StLo<=OOP && (StLo<OSL-StepTrall*Point || OSL==0)) SL=StLo;
                 }

               if((SL<OSL || OSL==0) && SL!=0)
                 {
                  if(!OrderModify(OrderTicket(),OOP,SL,TP,0,0)) Print("Error ",GetLastError(),"   Order Modify Sell   SL ",OSL,"->",SL);
                  else Print("Order Sell Modify   SL ",OSL,"-",SL);
                 }
              }
            if(OT==OP_BUYSTOP)  {PriceB=OOP; TicketB=OrderTicket();}
            if(OT==OP_SELLSTOP) {PriceS=OOP; TicketS=OrderTicket();}
           }
        }
     }
   if(b+TicketB==0)
     {
      if(Stoploss>=STOPLEVEL && Stoploss!=0) SL=NormalizeDouble(Bid-Stoploss*Point,Digits); else SL=0;
      if(Takeprofit>=STOPLEVEL && Takeprofit!=0) TP=NormalizeDouble(Ask+Takeprofit*Point,Digits); else TP=0;
      if(OrderSend(Symbol(),OP_BUYSTOP,Lot,NormalizeDouble(Ask+Step*Point,Digits),slippage,SL,TP,"news",Magic,0,0)!=-1) TimeBarB=TimeCurrent();
     }
   if(s+TicketS==0)
     {
      if(Stoploss>=STOPLEVEL && Stoploss!=0) SL=NormalizeDouble(Ask+Stoploss*Point,Digits); else SL=0;
      if(Takeprofit>=STOPLEVEL && Takeprofit!=0) TP=NormalizeDouble(Bid-Takeprofit*Point,Digits); else TP=0;
      if(OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid-Step*Point,Digits),slippage,SL,TP,"news",Magic,0,0)!=-1) TimeBarS=TimeCurrent();
     }
   if(TicketB!=0)
     {
      if(TimeBarB<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Ask+Step*Point,Digits)-PriceB)/Point>StepTrall)
        {
         if(Stoploss>=STOPLEVEL && Stoploss!=0) SL=NormalizeDouble(Bid-Stoploss*Point,Digits); else SL=0;
         if(Takeprofit>=STOPLEVEL && Takeprofit!=0) TP=NormalizeDouble(Ask+Takeprofit*Point,Digits); else TP=0;
         if(OrderModify(TicketB,NormalizeDouble(Ask+Step*Point,Digits),SL,TP,0,0)) TimeBarB=TimeCurrent();
        }
     }
   if(TicketS!=0)
     {
      if(TimeBarS<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Bid-Step*Point,Digits)-PriceS)/Point>StepTrall)
        {
         if(Stoploss>=STOPLEVEL && Stoploss!=0) SL=NormalizeDouble(Ask+Stoploss*Point,Digits); else SL=0;
         if(Takeprofit>=STOPLEVEL && Takeprofit!=0) TP=NormalizeDouble(Bid-Takeprofit*Point,Digits); else TP=0;
         if(OrderModify(TicketS,NormalizeDouble(Bid-Step*Point,Digits),SL,TP,0,0)) TimeBarS=TimeCurrent();
        }
     }
   return(0);
  }
//--------------------------------------------------------------------

avatar

  34  AM2 Сообщений: 15878 - Андрей

  • 14 марта 2016, 09:28
+
0
Отлично!!! Спасибо огромное Андрей!!!
avatar

  19  vic123 Автор Сообщений: 98

  • 14 марта 2016, 09:33

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари