[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 347

 

Уважаемые эксперты помогите кто-нибудь доработать этот код чтобы получился простенький советник. Суть проста открываем 2 позиции Sell и Bui с заданными стопами по текущей цене. Потом при срабатывании одного из тейков или обоих стопов открываем новые позиции и тд. Суть вроде проста а всё равно не получается Заранее благодарен!!!  

//+------------------------------------------------------------------+
//| 2DiffOrders.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
extern double lots=0.01;
extern int SL_in_pips;
extern int TP_in_pips;
int x2;
int init()
{
  if(SL_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && SL_in_pips>0)
{
SL_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Stoploss установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
if(TP_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && TP_in_pips>0)
{
TP_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Takeprofit установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
x2=1; 
while(x2!=0)
{
if(OrderSend(Symbol(),0,lots,Ask,2,Bid-15*Point,Bid+15*Point,0)!=-1)
{
Alert("Ордер типа BUY успешно открыт");
OrderSend(Symbol(),1,lots,Bid,2,Ask+15*Point,Ask-15*Point,0);
x2=GetLastError();
if(x2==0)
Alert("Ордер типа SELL успешно открыт");
if(x2!=0)
Alert("Ордер типа SELL не открыт. Ошибка №: ",x2);
}else
{
x2=GetLastError();
if(x2!=0)
Alert("Ордер типа BUY не открыт. Ошибка №: ",x2);
}
}
//----
return(0);
 

Файлы:
ala.mq4  3 kb
 
Reshetov >>:

Это только кажется, что ровно, а машинном представлении последний бит может принять разные значения. Т.е. 2.9999, 3 или 3.00000001


Чтобы избавиться от таких недоразумений в MQL есть функция NormalizeDouble()

да, NormalizeDouble() помогает, спасибо.

но всетаки непонятно, как такое возможно, вроде простое деление. причем если 0,5 или 0,9 или даже 0,31 делить на 0,1 все норм.

а тут явно у него 2,9 получается, непонятно... калькулятор точнее решает :-)

спасибо Reshetov и splxgf за помощь.

 
mukata >>:


но всетаки непонятно, как такое возможно, вроде простое деление. причем если 0,5 или 0,9 или даже 0,31 делить на 0,1 все норм.

а тут явно у него 2,9 получается, непонятно... калькулятор точнее решает :-)


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

 

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

Подскажите, пожалуйста, кто может!!!

Сам пока не понимаю как сделать.

Задача:

Советник выставляет 1-2 ордера 1 раз в сутки.

Начальное значение переменной задается вручную и может принимать значение от 1 до 10.

Необходимо изменение заданной ранее переменной с шагом 1 до значения - 10

в каждый рабочий день советника только на 1, если в этот день не исполняется TP.

При исполнении TP - переменной возвращается значение - 1.

Подсчет SL не подходит, потому, что может быть один или два, а значение можно менять только 1 раз в сутки.

Т.е.

Переменная = 1

День 1 SL - переменная =2

День 2 SL - переменная =3

День 3 SL - переменная =4

День 4 TP - переменная =1

День 5 SL - переменная =2

... и так далее.

Помогите!

Спасибо.

 
Enter писал(а) >>

Уважаемые эксперты помогите кто-нибудь доработать этот код чтобы получился простенький советник. Суть проста открываем 2 позиции Sell и Bui с заданными стопами по текущей цене. Потом при срабатывании одного из тейков или обоих стопов открываем новые позиции и тд. Суть вроде проста а всё равно не получается Заранее благодарен!!!

Ну для работы эксперта, "мясо" советника надо поместить все-таки в функцию старт...
 

Знатоки,пожалуйста помогите.

Есть код, вычисляет однопериодный моментум и интегрирует его с большим периодом, затем выводит как индикатор.

Нужно написать индикатор с заданным периодом, который находит среднюю от полученной кривой и выводит как индикатор.

Код прилагаю:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
#property indicator_width1 2

//------- Внешние параметры индикатора ----------------------------------------+
extern int MTM_Period = 1;
//extern int MTM_Integr_Period = 1000;

//extern int Applied_Price = 0; // Используемая цена:
// 0 - PRICE_CLOSE
// 1 - PRICE_OPEN
// 2 - PRICE_HIGH
// 3 - PRICE_LOW
// 4 - PRICE_MEDIAN
// 5 - PRICE_TYPICAL
// 6 - PRICE_WEIGHTED
extern int NumberOfBars = 1000; // Количество баров обсчёта (0-все)

//------- Буферы индикатора ---------------------------------------------------+
double buf0[];

//+----------------------------------------------------------------------------+
//| Custom indicator initialization function |
//+----------------------------------------------------------------------------+
void init() {
SetIndexBuffer (0, buf0);
SetIndexEmptyValue(0, 0);
SetIndexLabel (0, "i-mtm_integr");
SetIndexStyle (0, DRAW_LINE);
}

//+----------------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+----------------------------------------------------------------------------+
void deinit() {
Comment("");
}

//+----------------------------------------------------------------------------+
//| Custom indicator iteration function |
//+----------------------------------------------------------------------------+
void start() {
int LoopBegin, i,j, per=3;
double mtm, mtmsum;

if (NumberOfBars==0) LoopBegin=Bars-1;
else LoopBegin=NumberOfBars;
LoopBegin=MathMin(LoopBegin, Bars-1);

for (i=LoopBegin; i>=0; i--) {
mtm=Close[i]-Close[MTM_Period+i];
mtmsum=mtmsum+mtm;
buf0[i]=mtmsum;
}
/* for (i=LoopBegin-per;i>=per;i--){
mtm=Close[i]-Close[MTM_Period+i];
mtmsum[i]=0+mtm;
for (j=per;j<=0;j--){
mtmsum[i]=0+mtmsum[i+j];
mtmsum[i]=mtmsum[i]/per;
buf0[i]=mtmsum[i];
}
}*/
}
//+----------------------------------------------------------------------------+

 
VNG писал(а) >>

Знатоки,пожалуйста помогите.

Есть код, вычисляет однопериодный моментум и интегрирует его с большим периодом, затем выводит как индикатор.

Нужно написать индикатор с заданным периодом, который находит среднюю от полученной кривой и выводит как индикатор.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Red
#property indicator_width1 2

//------- Внешние параметры индикатора ----------------------------------------+
extern int MTM_Period = 1; 
//extern int MTM_Integr_Period = 1000; 

//extern int Applied_Price = 0; // Используемая цена:
// 0 - PRICE_CLOSE
// 1 - PRICE_OPEN
// 2 - PRICE_HIGH
// 3 - PRICE_LOW
// 4 - PRICE_MEDIAN
// 5 - PRICE_TYPICAL
// 6 - PRICE_WEIGHTED
extern int NumberOfBars = 1000; // Количество баров обсчёта (0-все)
extern int MA_Period=3;
extern int MA_Mode=0;

//------- Буферы индикатора ---------------------------------------------------+
double buf0[];
double MA[];
//+----------------------------------------------------------------------------+
//| Custom indicator initialization function |
//+----------------------------------------------------------------------------+
void init() {
  SetIndexBuffer (0, buf0);
  SetIndexEmptyValue(0, 0);
  SetIndexLabel (0, "i-mtm_integr");
  SetIndexStyle (0, DRAW_LINE);
  SetIndexBuffer (1, MA);
  SetIndexLabel (1, "MA");
  SetIndexStyle (1, DRAW_LINE);

}

//+----------------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+----------------------------------------------------------------------------+
void deinit() {
Comment("");
}

//+----------------------------------------------------------------------------+
//| Custom indicator iteration function |
//+----------------------------------------------------------------------------+
void start() {
  int LoopBegin, i,j, per=3;
  double mtm, mtmsum;

  if (NumberOfBars==0) LoopBegin=Bars-1;
  else LoopBegin=NumberOfBars;
  LoopBegin=MathMin(LoopBegin, Bars-1);

  for (i=LoopBegin; i>=0; i--) {
    mtm=Close[i]-Close[MTM_Period+i];
    mtmsum=mtmsum+mtm;
    buf0[i]=mtmsum;
  }
  for (i=LoopBegin-per;i>=per;i--){
     MA[i]= iMAOnArray( buf0, 0, MA_Period, 0, MA_Mode, i);
  }
}
//+----------------------------------------------------------------------------+
Возможно такой вариант подойдет. Код не проверял, писал в браузере
 
Reshetov >>:

Это только кажется, что ровно, а машинном представлении последний бит может принять разные значения. Т.е. 2.9999, 3 или 3.00000001

Чтобы избавиться от таких недоразумений в MQL есть функция NormalizeDouble()


Почему функция NormalizeDouble() не запускается по умолчанию для всех значений Ask, Bid, Low, и т.д.

Все на этом попадались, всем потом приходится исправлять это "вручную".. Странно что МТ не может прочесть то что сам и породил.

 
Silen >>:

Спасибо, а есть гарантия что данные будут доступны в start()?

для гарантии можно попробовать использовать RefreshRates() - посмотрите примеры в стандартной справке Метаедитора

 

В оптимизации Советников есть опция "Сохранить как отчет", но при этом "Входные Параметры" в интернет эксплорере не показываются,

хотя, судя по html-коду, они в нем присутствуют. В общем то ради этих параметров оптимизация и запускалась.

Может кто-нибудь знает как их увидеть в эксплорере?


(есть еще возможность скопировать их в текстовый файл отдельной командой, но увидеть их в IE предпочтительнее)

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