Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 752

 
извиняюсь за очень простой вопрос, как закрыть открытую позицию? в mql4 была функция OrderClose(), а тут как?
 
RogozaIV:
извиняюсь за очень простой вопрос, как закрыть открытую позицию? в mql4 была функция OrderClose(), а тут как?

В mql5 надо открыть противоположную, это во вкладке терминала History хорошо видно. Проще всего использовать класс CTrade из стандартной библиотеки.
 
спасибо Alexey Volchanskiy!
 
Подскажите можно ли где торговать криптовалюты через MT5? Брокеры, биржи? МТ4 нашел, а МТ5 как бы и нет вроде.
 

Господа, скажите пожалуйста где ошибка.

Подготавливаю индикатор для вызова в советнике. 

Из индикатора требуется передать буфер.

Результат - к бару перекреплено значения int.

Вообще задача передать эксперту двумерный массив из индикатора, а как сделать не фурычу.

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2

int per[];

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,per,INDICATOR_CALCULATIONS); //также пробовал INDICATOR_DATA и INDICATOR_COLOR_INDEX
...

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
{
      for(int b=1; b<Bmax; b++) //отбор по x
        {
         for(int p=1; p<Pmax; p++) // отбор по y
           {
            if(arrayZ[6][p][b]>0||arrayZ[6][p][b]<0)
            {
             per[b]=p;
            }
           }
        }
 }

ну и вызываю его в советнике

int OnInit()
  {
//--- create timer
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA); 
   ResetLastError(); 
   MA_handle=iCustom(NULL,0,"Topqw",0,1); 

   Print("MA_handle = ",MA_handle,"  error = ",GetLastError()); 
...

void OnTick()
//void OnTimer()
  {
//--- 
int copy=CopyBuffer(MA_handle,0,0,1000,Label1Buffer); 
   Print("copy =",copy," ",Label1Buffer[999]);//

 
Top2n:

Господа, скажите пожалуйста где ошибка.

Подготавливаю индикатор для вызова в советнике. 

Из индикатора требуется передать буфер.

Результат - к бару перекреплено значения int.

Вообще задача передать эксперту двумерный массив из индикатора, а как сделать не фурычу.

ну и вызываю его в советнике



1. Нужно помнить, что в ИНДИКАТОРЕ по-умолчанию индикаторный буфер с индексом "0" соответствует самому ЛЕВОМУ бару на графике.

2. В советнике нет команды "SetIndexBuffer".

3. iCustom - это создание пользовательского индикатора, а не запрос буфера (поэтому всё нужно прописывать явно, а не ",0,1"). В Вашем случае можно использовать такую форму

//--- create handle of the indicator Topqw
   ResetLastError();
   handle_Topqw=iCustom(Symbol(),Period(),"Topqw",PRICE_CLOSE);
//--- if the handle is not created 
   if(handle_Topqw==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the Topqw indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }

4. CopyBuffer вроде верно написан.

5. Двумерный массив не передать - сделайте два массива-индикаторных буфера.

 
Vladimir Karputov:


1. Нужно помнить, что в ИНДИКАТОРЕ по-умолчанию индикаторный буфер с индексом "0" соответствует самому ЛЕВОМУ бару на графике.

2. В советнике нет команды "SetIndexBuffer".

3. iCustom - это создание пользовательского индикатора, а не запрос буфера (поэтому всё нужно прописывать явно, а не ",0,1"). В Вашем случае можно использовать такую форму

4. CopyBuffer вроде верно написан.

5. Двумерный массив не передать - сделайте два массива-индикаторных буфера.


Спасибо, за поправку, вот только не пойму, если задать явно для передачи массивов, то формализуется как? где указывать что мне нужно извлечь два массива?

MA_handle=iCustom(Symbol(),Period(),"TopFidCounselor",per,bar); per,bar - же массивы, а данные должны быть imput,
в индикаторе записываю в массивы
   SetIndexBuffer(0,per,INDICATOR_CALCULATIONS);
   SetIndexBuffer(1,bar,INDICATOR_CALCULATIONS);

если я сделаю такую запись
int OnCalculate(
...
  {
//--------------------------------------------------------------
  for ( int i = 0; i < rates_total; i ++ ) per[i] = price[i];  -
//--------------------------------------------------------------
ТО СОВЕТНИК РАБОТАЕТ БЕЗ ОШИБКИ
а если такую
//----------------------------------------------------------------
      for(int b=1; b<200; b++) //отбор по х			-
        {							-
         for(int p=1; p<200; p++) // отбор по у			-
           {							-
            if(arrayZ[6][p][b]>0||arrayZ[6][p][b]<0)		-
            {							-
             per[b]=p;						-
             bar[b]=b;						-
            }							-
           }							-
        }							-
//----------------------------------------------------------------
ТО ОШИБКА код 4002

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

Верно ли то что я использую  в индикаторе INDICATOR_CALCULATIONS?

   SetIndexBuffer(0,per,INDICATOR_CALCULATIONS);
 

С ошибкой 4002 решен вопрос.

только не ясно, куда записывать извлекаемый массив?

   int copy=CopyBuffer(MA_handle,0,0,bars,per); //per?
 
Top2n:

С ошибкой 4002 решен вопрос.

только не ясно, куда записывать извлекаемый массив?


Массив per объявляется в советнике, в процедуре, в которой Вы выполняете копирование. Это должен быть динамический массив (объявляется как [] - без указания размерности).
Причина обращения: