[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 436

 
semiromid:

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

Как в этот коментарий "Возникла ошибка " можно добавить переменную ?

OrderSend(Symbol(),OP_SELLSTOP,0.1,Ask-50*Point,3,Bid+150*Point,Bid-150*Point, "Возникла ошибка ", 0);


string Stroka;

double x;

.............

.............


Stroka=StringConcatenate ( "Возникла ошибка ", DoubleToStr(x, 0) );

OrderSend(Symbol(),OP_SELLSTOP,0.1,Ask-50*Point,3,Bid+150*Point,Bid-150*Point, Stroka, 0);

 
bercut0077:

Добрый день эксперты, в индикаторе меня интересует получаемое советником значение

Специальные константы, используемые для указания состояния параметров и переменных. Mогут быть следующими величинами:

Константа Значение Описание
NULL 0 Указывает пустое состояние строки
EMPTY -1 Указывает пустое состояние параметра
EMPTY_VALUE 0x7FFFFFFF Значение по умолчанию, указатель пустого значения. Используется в пользовательских индикаторах
CLR_NONE 0xFFFFFFFF Указывает отсутствие цвета
WHOLE_ARRAY 0 Используется с функциями массивов. Указывает, что все элементы массива должны быть обработаны


0x7FFFFFFF в шестнадцатеричном представлении равно 2147483647 в десятиричном.

Т.е. в какой-то момент времени в буфере индикатора появляется пустое значение - его-то вы и видите в советнике. Можете сами задать значение "пустого значения" буфера индикатора:

void SetIndexEmptyValue( int index, double value)

Устанавливает значение пустой величины для линии индикатора. Пустые значения не рисуются и не показываются в DataWindow. По умолчанию значение пустой величины - EMPTY_VALUE.
Параметры:
index - Порядковый номер линии. Должен быть от 0 до 7.
value - Новое "пустое" значение.
 
peshihod:


Т.е. момент открытия не важен, минуту назад открылся или две?

Пункт 2 не понятен. Как-то расплывчато всё.

Время открытия можно определить по OrderOpenTime().

Т.е. момент открытия не важен, минуту назад открылся или две?


Мгновенное открытие

1.Моментальное(Сиюсекундное +0.5 - 2 секунды) определение вновь открывшегося торгового(не отложеных ордеров) ордера(Ордера открытого вручную и открытого спомощью советника).Система идентефецируюет ордер из друх вариантов (Sell или Byu) .

Если система определила ордер который рание не был открыт . то идет продолжение под номером 2.

2. Выполняеться какая то задача (Например,если Sell: Alert("Открытый ордер на продажу"+y);),(Например,если byu: Alert("Открыт ордер на покупку"+w);), всего 1-н раз,именно для этого ордера .

После того как еще открылся один ордер(толи системой, толи вручную ), система вновь действует с пункта 1 по пункт 2 .

 
peshihod:

string Stroka;

double x;

.............

.............


Stroka=StringConcatenate ( "Возникла ошибка ", DoubleToStr(x, 0) );

OrderSend(Symbol(),OP_SELLSTOP,0.1,Ask-50*Point,3,Bid+150*Point,Bid-150*Point, Stroka, 0);


Кульная комбинация ) Эм..
 
artmedia70:

Специальные константы, используемые для указания состояния параметров и переменных. Mогут быть следующими величинами:

Да это понятно, но не ясно как индикатор вылечить от этих пустых значений, по этому и код опубликовал, нужна реальная помощь т.е нужно что бы индикатор выдавал всегда 1 или -1.
 
bercut0077:
Да это понятно, но не ясно как индикатор вылечить от этих пустых значений, по этому и код опубликовал, нужна реальная помощь т.е нужно что бы индикатор выдавал всегда 1 или -1.
Я привел пример функции, которая устанавливает значение пустой величины для линии индикатора. Можете поступить иначе. Если нужны только лишь два значения +1 и -1, то, при появлении пустого значения, проверяйте прошлое состояние (+1 или -1) и вписывайте его вместо пустого значения. Тогда всегда в буфере будет либо +1, либо -1.
Допустим есть значение +1. Появилось пустое значение. Вместо него продолжаете вписывать в буфер прошлое значение (+1) как только появилось -1, вписываете его.
Теперь в буфере будет -1. Как только появилось пустое значение, проверяете прошлое значение (оно теперь -1), вписываете его.
Таким образом всегда будете иметь в буфере +1 или -1
 
artmedia70:

Спасибо. Появилась еще задачка ...
 
semiromid:

1.Моментальное(Сиюсекундное +0.5 - 2 секунды) определение вновь открывшегося торгового(не отложеных ордеров) ордера(Ордера открытого вручную и открытого спомощью советника).Система идентефецируюет ордер из друх вариантов (Sell или Byu) .

Если система определила ордер который рание не был открыт . то идет продолжение под номером 2.

2. Выполняеться какая то задача (Например,если Sell: Alert("Открытый ордер на продажу"+y);),(Например,если byu: Alert("Открыт ордер на покупку"+w);), всего 1-н раз,именно для этого ордера .

После того как еще открылся один ордер(толи системой, толи вручную ), система вновь действует с пункта 1 по пункт 2 .


Так понимаю, что выставленный(отложенный) ордер и открытый ордер - это разные ордера. А если отложенный ордер, открывается то задача сводиться к исходной, к открытому ордеру. Если я правильно понимаю, то сложно получается.

А что за задачи? Может быть всё проще можно сделать?

 
Уважаемые эксперты помогите изменить код, нужно получить
Cur_Trend без пустой величины, тоесть если появляется пустота, то нужно заменить последним известным значением
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 LightBlue
#property indicator_color2 Magenta

double CrossUp[];
double CrossDown[];
double Cur_Trend[];
int CurrentTrend = 0;
int starttime = 0;
extern int FasterEMA = 5;
extern int SlowerEMA = 8;

int init()
  {
   IndicatorBuffers(3); 
   SetIndexStyle(0, DRAW_ARROW, EMPTY);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW, EMPTY);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
   SetIndexBuffer(2, Cur_Trend);
   starttime = TimeLocal(); 
   return(0);
  }

int deinit()
  {
   return(0);
  }

int start() { 
   int limit, i, counter, loop, ii;
   double fasterEMAnow, slowerEMAnow, fasterEMAprevious, slowerEMAprevious, fasterEMAafter, slowerEMAafter;
   double Range, AvgRange;
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   loop = 0;
   for(i = 0; i <= limit; i++) {
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
      {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range=AvgRange/10;
      fasterEMAnow = iMA(NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, i);
      fasterEMAprevious = iMA(NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, i+1);
      fasterEMAafter = iMA(NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, i-1);
      slowerEMAnow = iMA(NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_OPEN, i);
      slowerEMAprevious = iMA(NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_OPEN, i+1);
      slowerEMAafter = iMA(NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_OPEN, i-1); 
      if ((fasterEMAnow > slowerEMAnow) && (fasterEMAprevious < slowerEMAprevious) && (fasterEMAafter > slowerEMAafter)) {
         CrossUp[i] = Low[i] - Range*0.5;
         if ((loop == 0) && (CurrentTrend != 1))  {
            CurrentTrend = 1;
            Cur_Trend[ii]= CurrentTrend;
            }
         if (loop == 0)  {
            loop = 1;
            }
      }
      else if ((fasterEMAnow < slowerEMAnow) && (fasterEMAprevious > slowerEMAprevious) && (fasterEMAafter < slowerEMAafter)) {
              CrossDown[i] = High[i] + Range*0.5;
           if ((loop == 0) && (CurrentTrend != -1))  {
              CurrentTrend = -1;
              Cur_Trend[ii]= CurrentTrend;
           }
           if (loop == 0)  {
              loop = 1;
          }
       }
   }
   return(0);
}
 

Уважаемые эксперты!

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

Файлы: