Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 119

 
trader781:

ок, я понял

 

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

 

ну и  

double OP = 5.00000

  TP = (OP/100);

  Print("TP= ",TP);

2017.02.09 21:36:03.650 2015.01.05 04:00:00  martin H1-1 USDJPY,H1: TP= 0.5 

не понимаю с каких пор разделить 5 на 100 будет 0.5  

я же вам выкладывал исправленный код, как правильно нужно

//+------------------------------------------------------------------+
//|                                                     Close_MA.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern bool Uslovie1=false;//Uslovie 4 6+50 MA

extern bool OpenOrders=false;//+---Открыть ордер

extern double Lots=0.01; //Oбьем открываемого ордера

extern const string Настройки_работы_советника="";

extern int Period1=6;//Период 1МА
extern ENUM_APPLIED_PRICE PRICE1=PRICE_MEDIAN;             // 1МА По цене

extern int Period2=50;//Период 2МА
extern ENUM_APPLIED_PRICE PRICE2=PRICE_MEDIAN;             // 2МА По цене

extern int Period3=1000;//Период 3МА
extern ENUM_APPLIED_PRICE PRICE3=PRICE_MEDIAN;             // 3МА По цене

extern uint X=1;                                           // отклонение от ма, пунктов
extern bool PlaySound=false;
extern int M=1000;                                         // миллисекунды в Sleep
extern int R;                                              // раз повторения музыки
extern int count=0;
extern int Step=500;                                      // счетчик тиков 500макс.
int   i;                                                   // исходный счетчик ордеров
int   p=0;                                                 // внутренняя для playSound
bool  y = false;                                           // для удобства сравнений условий 1,2,3,4,5,6  
bool  dummy;                                               // для выхода функций в переменную
int   ticket = 0;                                          // тикет открываемого ордера
int Magic=222;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+



int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
     {
      if(Bars<801 || (IsTradeAllowed()==false)) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
         return;
     }
//+----------------------------------------------------------------

   double ma1=NormalizeDouble(iMA(NULL,0,Period1,0,MODE_SMA,PRICE1,0),5);

   double ma2=NormalizeDouble(iMA(NULL,0,Period2,0,MODE_SMA,PRICE1,0),5);   //три заданных параметра ма

   double ma3=NormalizeDouble(iMA(NULL,0,Period3,0,MODE_SMA,PRICE1,0),5);
//+-----------------------------------------------------------------  Открытие ордеров

//+----Купить

     {
      if(MathAbs(Bid-ma3)<1000*Point() && (myOrdersTotal()==false))
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,50,0,0,"",Magic,0,clrLightGray);//+------отправка 1 ордера
         HLineCreate(0,"buy",0,FindLastOrderOpenPrice(),clrAzure,STYLE_DASHDOT,3);
        }
      else if((Ask>=(FindLastOrderOpenPrice()+(Step*_Point))) && myOrdersTotal())//+------------если ордер в плюс
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,50,0,0,"",Magic,0,clrLightGray);
         HLineMove(0,"buy",FindLastOrderOpenPrice());
        }
      else if((Ask<=(FindLastOrderOpenPrice()-(Step*_Point))) && myOrdersTotal())//+------------если ордер вплюс
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,50,0,0,"",Magic,0,clrLightGray);
         HLineMove(0,"buy",FindLastOrderOpenPrice());
        }
      else if(ticket==0)
        {
         return;
        }

/*          
                               //+----Продать

         if(MathAbs(Bid-ma3)>1000*Point() && (myOrdersTotal()==false))
           {
            ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",Magic,0,clrLightGray);//+------отправка 1 ордера
            HLineCreate1();  
           }
         else if ((Ask>=(FindLastOrderOpenPrice()+(Step*_Point)))&& myOrdersTotal())//+------------если ордер в минус
              {
            ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",Magic,0,clrLightGray);
            HLineMove1();
              }
         else if ((Ask<=(FindLastOrderOpenPrice()-(Step*_Point)))&& myOrdersTotal())//+------------если ордер вплюс
              {
            ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",Magic,0,clrLightGray);
            HLineMove1();
              }
         else if(ticket==0)
           {
            return;
           }       */

     }

//+------------------------------------------------------------------Условия
   if(Uslovie1==true) //Bid+ma800
     {
      if((Bid>=ma3-X*Point && Bid<ma3) || (Bid<=ma3+X*Point && Bid>ma3))
        {
           {y=true;}
        }
     }
//+------------------------------------------------------------------закрыть покупки или продажи

   if((y==true) && (myOrdersTotal()==true)) //продажа
     {
      dummy=(OrderClose(OrderTicket(),OrderLots(),Ask,0,White));
     }
   if((y==true) && (myOrdersTotal()==false))
     {
      dummy=false;
      HLineDelete(0,"buy");
      //  ExpertRemove();  
     }

  }
//+------------------------------------------------------------------+
bool myOrdersTotal() //если ордера есть
  {
   for(i=OrdersTotal()-1; i>=0; i--) //   цикл будет работать пока не останется ордеров
     {
      if(((OrderSelect(i,SELECT_BY_POS,MODE_TRADES))==true) && OrderSymbol()==Symbol() && (OrderType()<2))
        {
         return true;
        }
     }
   return false;
  }
//-------------------------------------------------------------------
double FindLastOrderOpenPrice()
  {
   double oldorderopenprice=0;
   int    oldticket=0;
   ticket=0;
   for(i=OrdersTotal()-1; i>=0; i--) //   цикл будет работать пока не останется ордеров
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic)
         && (OrderType()==OP_BUY || OrderType()==OP_SELL))
        {
         oldticket=OrderTicket();
         if(oldticket>=ticket)
           {
            ticket=oldticket;
            oldorderopenprice=OrderOpenPrice();
           }
        }
     }
   return(oldorderopenprice);
  }
//-------------------------------------------------------------------  

//+------------------------------------------------------------------+
//| Создает горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineCreate(const long            chart_ID=0,        // ID графика
                 const string          name="HLine",      // имя линии
                 const int             sub_window=0,      // номер подокна
                 double                price=0,           // цена линии
                 const color           clr=clrRed,        // цвет линии
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
                 const int             width=1,           // толщина линии
                 const bool            back=false,        // на заднем плане
                 const bool            selection=true,    // выделить для перемещений
                 const bool            hidden=true,       // скрыт в списке объектов
                 const long            z_order=0)         // приоритет на нажатие мышью
  {
//--- если цена не задана, то установим ее на уровне текущей цены Bid
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим горизонтальную линию
   if(ObjectFind(chart_ID,name)!=sub_window)
     {
      if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
        {
         Print(__FUNCTION__,
               ": не удалось создать горизонтальную линию! Код ошибки = ",GetLastError());
         return(false);
        }
     }
//--- установим цвет линии
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Перемещение горизонтальной линии                                 |
//+------------------------------------------------------------------+
bool HLineMove(const long   chart_ID=0,   // ID графика
               const string name="HLine", // имя линии
               double       price=0)      // цена линии
  {
//--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
   ResetLastError();
//--- переместим горизонтальную линию
   if(ObjectFind(chart_ID,name)==-1)return(false);
   if(!ObjectMove(chart_ID,name,0,0,price))
     {
      Print(__FUNCTION__,
            ": не удалось переместить горизонтальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Удаляет горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineDelete(const long   chart_ID=0,   // ID графика
                 const string name="HLine") // имя линии
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- удалим горизонтальную линию
   if(ObjectFind(chart_ID,name)==-1)return(false);
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": не удалось удалить горизонтальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+


 ...

 
trader781:

ок, я понял

 

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

 

ну и  

double OP = 5.00000

  TP = (OP/100);

  Print("TP= ",TP);

2017.02.09 21:36:03.650 2015.01.05 04:00:00  martin H1-1 USDJPY,H1: TP= 0.5 

не понимаю с каких пор разделить 5 на 100 будет 0.5  

не знаю почему у вас там не выходит правильно разделить, у меня все делиться

void OnStart()
  {
//---
   double OP = 5.00000;

  double TP = OP/100;

  Print("TP= ",TP);
  }

 результат

2017.02.10 06:22:48.633 Script test USDCHF,H1: loaded successfully
2017.02.10 06:22:48.663 test USDCHF,H1: initialized
2017.02.10 06:22:48.663 test USDCHF,H1: TP= 0.05
2017.02.10 06:22:48.663 test USDCHF,H1: uninit reason 0
2017.02.10 06:22:48.663 Script test USDCHF,H1: removed


 ...

 
Sergey Gritsay:

не знаю почему у вас там не выходит правильно разделить, у меня все делиться

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

Здравствуйте.

Помогите разобраться с вопросом.

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

Код:

modify=OrderModify(OrderTicket(),new_Pr+50*Point,OrderStopLoss(),OrderTakeProfit(),0,Blue);

                  if(modify==true)

           {

               Print("BUYSTOP order modify OrderOpenPrice() : ",OrderOpenPrice());

           }

И записи журнала:

modify #1 buy stop 1.00 GBPUSD at 1.60150 sl: 1.59590 tp: 1.63464 ok

BUYSTOP order modify OrderOpenPrice()  :  1.6028

modify #1 buy stop 1.00 GBPUSD at 1.60070 sl: 1.59590 tp: 1.63464 ok

BUYSTOP order modify OrderOpenPrice()  :  1.6015

 
Роман:

Здравствуйте.

Помогите разобраться с вопросом.

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

Код:

modify=OrderModify(OrderTicket(),new_Pr+50*Point,OrderStopLoss(),OrderTakeProfit(),0,Blue);

                  if(modify==true)

           {

               Print("BUYSTOP order modify OrderOpenPrice() : ",OrderOpenPrice());

           }

И записи журнала:

modify #1 buy stop 1.00 GBPUSD at 1.60150 sl: 1.59590 tp: 1.63464 ok

BUYSTOP order modify OrderOpenPrice()  :  1.6028

modify #1 buy stop 1.00 GBPUSD at 1.60070 sl: 1.59590 tp: 1.63464 ok

BUYSTOP order modify OrderOpenPrice()  :  1.6015

В OrderOpenPrice() записана цена, которая была во время применения OrderSelect(). Значение само не поменяется, никак. Надо снова вызвать OrderSelect() после модификации ордера.
 
Vitalie Postolache:
В OrderOpenPrice() записана цена, которая была во время применения OrderSelect(). Значение само не поменяется, никак. Надо снова вызвать OrderSelect() после модификации ордера.
Спасибо. Буду пробовать.
 

Прошу помощи!

Цель - из массива вырезать нули (иные числа), при этом сохранить последовательность чисел в массиве

Сделал такой код, но затирается массив - что-то не так - подскажите, пожалуйста, что не так.

//+------------------------------------------------------------------+
//|                                             Test_MassivObrez.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int massivSize=19; //размер массива  
   double summDelta[19]=
     {
      0,
      20,
      30,
      0,
      0,
      51,
      0,
      53,
      54,
      60,
      70,
      80,
      120,
      150,
      0,
      210,
      223,
      232,
      250,
      0
     };


      int SizeMass=ArraySize(summDelta);//Узнаем размер массива
      int CalcZrero=0;
      for(int i=0;i<SizeMass;i++)
      {
       Print ("Число на проверку=",summDelta[i], " цикл ",i);
       if (summDelta[i]!=0)
       {
         Print ("Число до исключения нуля=",summDelta[i], " цикл ",i);
         for(int i=0;i<SizeMass;i++) printf("Состав массива до исключения нуля summDelta[%d] = %G",i,summDelta[i]);  
         ArrayCopy(summDelta,summDelta,i-CalcZrero,i);
         Print ("Число после исключения нуля=",summDelta[i-CalcZrero], " цикл ",i);
         for(int i=0;i<SizeMass;i++) printf("Состав массива после исключения нуля summDelta[%d] = %G",i,summDelta[i]);  
       }
       else CalcZrero++;      
      }

     for(int i=0;i<SizeMass;i++) printf("Массив после исключения нуля summDelta[%d] = %G",i,summDelta[i]);            
     ArrayResize(summDelta,SizeMass-CalcZrero,0);
     SizeMass=ArraySize(summDelta);//Узнаем новый размер массива
     for(int i=0;i<SizeMass;i++) printf("Массив после исключения нуля и обрезания summDelta[%d] = %G",i,summDelta[i]);            
  }
//+------------------------------------------------------------------+
 
-Aleks-:

Прошу помощи!

Цель - из массива вырезать нули (иные числа), при этом сохранить последовательность чисел в массиве

Сделал такой код, но затирается массив - что-то не так - подскажите, пожалуйста, что не так.

//+------------------------------------------------------------------+
//|                                             Test_MassivObrez.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

Я поступил-бы так:

   int n=-1;
   double ResummDelta[]; // создадим новый массив
   double summDelta[]=
     {
      0,
      20,
      30,
      0,
      0,
      51,
      0,
      53,
      54,
      60,
      70,
      80,
      120,
      150,
      0,
      210,
      223,
      232,
      250,
      0
     };
    
    for(int i=0;i<ArraySize(summDelta);i++) {    
     if(summDelta[i]!=0) {
      n++;
      ArrayResize(ResummDelta,n+1);
      ResummDelta[n]=summDelta[i];
     }  
    }
   // Print( ArraySize(summDelta)," = ",ArraySize(ResummDelta) );//Узнаем новый размер массива  
 
-Aleks-:

Прошу помощи!

Цель - из массива вырезать нули (иные числа), при этом сохранить последовательность чисел в массиве

Сделал такой код, но затирается массив - что-то не так - подскажите, пожалуйста, что не так.

Навскидку, я бы сделал иначе. 

double a[ 20 ] = { /*массив значений*/ };
double b[ 20 ];
//--- Проверяем массив а на наличие 0 значений
int j = 0;
for( int i = 0; i < 20; i++ )
   {
    if( a[ i ] != 0 )
      {
       b[ j ] = a[ i ];
       j++;
      }  
   }
//--- Изменяем размер массива а на значение j
//--- Копируем массив b в массив a

Да, тут еще вопрос в корректности сравнения вещественных чисел с 0 таким методом.


 

 

Сижу думаю насчет вот такой задачи, в реале не тестил, ставить или нет. Или указать другие варианты.

 

Допустим у меня сигнал - при резком расширении спреда (на новостях)

закрыть все текущие сделки

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

поэтому если взять команду допустим OrderClose засунуть в цикл и выполнять до тех пор пока не закроется (аналогично с OrderSend)  и прочими командами которые могут завершится неудачно

Причина обращения: