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

 
_SS_:
Как определить тип открытого ордера?

OrderType()

А вообще-то с учебника начать нужно... :) Или хотя-бы пользуйтесь F1 в MetaEditor`е

int OrderType( )
Возвращает тип операции текущего выбранного ордера. Mожет быть одной из следующих величин:
OP_BUY - позиция на покупку,
OP_SELL - позиция на продажу,
OP_BUYLIMIT - отложенный ордер на покупку по достижении заданного уровня, текущая цена выше уровня,
OP_BUYSTOP - отложенный ордер на покупку по достижении заданного уровня, текущая цена ниже уровня,
OP_SELLLIMIT - отложенный ордер на продажу по достижении заданного уровня, текущая цена ниже уровня,
OP_SELLSTOP - отложенный ордер на продажу по достижении заданного уровня, текущая цена выше уровня.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Пример:
  int order_type;
  if(OrderSelect(12, SELECT_BY_POS)==true)
    {
     order_type=OrderType();
     // ...
    }
  else
    Print("OrderSelect() вернул ошибку - ",GetLastError());
 
gheka:

double NormalizeDouble( double value, int digits)

value - Величина с плавающей точкой. --- это как?
digits - Формат точности, число цифр после десятичной точки (0-8). --- типа 1.29800 получается 5 знаков,так?

Величина с плавающей точкой - это действительное число типа double

А вместо digits используйте переменную типа int

Например int dg=MarketInfo(Symbol(), MODE_DIGITS);

 
extern double Lot=0.01; // Жестко заданное колич. лотов
datetime time;
//--------------------------------------------------------------- 2 --
int start()
{
int Total;


bool
Ans =false, // Ответ сервера после закрытия
Cls_B=false, // Критерий для закрытия Buy
Cls_S=false, // Критерий для закрытия Sell
Opn_B=false, // Критерий для открытия Buy
Opn_S=false; // Критерий для открытия Sell

//--------------------------------------------------------------- 3 --
// Учёт ордеров


for(int i=OrdersTotal()-1;i>=0;i--)
if (OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol()&&OrderType()>1)Total++;

if(Total!=0 || time==Time[1])return;

static int KolBars;



if (Close[0]-Open[0] > Point && Close[1]-Open[1] > Point && Bars == KolBars)


{

KolBars=Bars ; // запоминаем кол-во бар при которых совершались действия

}




// Торговые критерии

// Критерий откр. Buy


Opn_B=true;

//--------------------------------------------------------------- 7 --


if (Opn_B)
{OrderSend(Symbol(),OP_BUY,Lot,Ask,0,0,0);time=Time[1];}

}




Помогите пожалуйста, прошу 3й раз. Элементарный советник, открывает позицию на покупку при появлении новой свечки (при условии, что предыдущие 2 свечки зеленые), а закрывает позицию при закрытии свечки, на которой была открыта позиция, или на закрытии следующей свечки.

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

 
artmedia70:

Величина с плавающей точкой - это действительное число типа double

А вместо digits используйте переменную типа int

Например int dg=MarketInfo(Symbol(), MODE_DIGITS);


Мне написали: "Нормализацию сделайте (NormalizeDouble()), проверьте на ограничение максимального/минимально лота, если пятизнак - увеличьте стоп и профит в 10раз."


В документации пишут: "Округление числа с плавающей запятой до указанной точности. Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров должны быть нормализованы с точностью, значение которой хранится в предопределенной переменной Digits."

В учебнике не нашел, я так понял мне надо через NormalizeDouble --- нормализовать текущую цену,StopLoss и TakeProfit ? если да то как именно?

double NormalizeDouble( double value, int digits)

double value -- вместо него я могу ставить например Prise

int digits -- а сюда переменную dg которому равна MarketInfo(Symbol(), MODE_DIGITS); ???

 
gheka:


Мне написали: "Нормализацию сделайте (NormalizeDouble()), проверьте на ограничение максимального/минимально лота, если пятизнак - увеличьте стоп и профит в 10раз."


В документации пишут: "Округление числа с плавающей запятой до указанной точности. Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров должны быть нормализованы с точностью, значение которой хранится в предопределенной переменной Digits."

В учебнике не нашел, я так понял мне надо через NormalizeDouble --- нормализовать текущую цену,StopLoss и TakeProfit ? если да то как именно?

double NormalizeDouble( double value, int digits)

double value -- вместо него я могу ставить например Prise

int digits -- а сюда переменную dg которому равна MarketInfo(Symbol(), MODE_DIGITS); ???

int StopLoss=50; // СтопЛосс в пунктах

int TakeProfit=150; // ТейкПрофит в пунктах

int SetOrderDistance=50; // Дистанция установки отложенных ордеров в пунктах

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

int pt=MarketInfo(Symbol(), MODE_POINT); // Размер пункта в валюте котировки

int dg=MarketInfo(Symbol(),MODE_DIGITS); // Количество цифр после десятичной точки в цене инструмента

int StLev=MarketInfo(Symbol(), MODE_STOPLEVEL); // Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах

double pa=MarketInfo(Symbol(), MODE_ASK); // Цена Аск

double pb=MarketInfo(Symbol(), MODE_BID); // Цена Бид

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

double slB=NormalizeDouble(pa-StopLoss*pt, dg); // Нормализация ценового уровня СтопЛосс для позиции Бай

double tpB=NormalizeDouble(pa+TakeProfit*pt, dg); // Нормализация ценового уровня ТейкПрофит для позиции Бай

double slS=NormalizeDouble(pb+StopLoss*pt, dg); // Нормализация ценового уровня СтопЛосс для позиции Селл

double tpS=NormalizeDouble(pb-TakeProfit*pt, dg); // Нормализация ценового уровня ТейкПрофит для позиции Селл

double SetB=NormalizeDouble(pa+SetOrderDistance*pt, dg); // Нормализация цены установки отложенного ордера Бай

double SetS=NormalizeDouble(pb-SetOrderDistance*pt, dg); // Нормализация цены установки отложенного ордера Селл

double slBS=NormalizeDouble(SetB-StopLoss*pt, dg); // Нормализация ценового уровня СтопЛосс отложенного ордера Бай

double tpBS=NormalizeDouble(SetB+TakeProfit*pt, dg); // Нормализация ценового уровня ТейкПрофит отложенного ордера Бай

double slSS=NormalizeDouble(SetS+StopLoss*pt, dg); // Нормализация ценового уровня СтопЛосс отложенного ордера Селл

double tpSS=NormalizeDouble(SetS-TakeProfit*pt, dg); // Нормализация ценового уровня ТейкПрофит отложенного ордера Селл

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Разбирайтесь... :)

И не забудьте о существовании СтопЛевел - int StLev=MarketInfo(Symbol(), MODE_STOPLEVEL);

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

 
artmedia70:

int StopLoss=50; // СтопЛосс в пунктах

int TakeProfit=150; // ТейкПрофит в пунктах

int SetOrderDistance=50; // Дистанция установки отложенных ордеров в пунктах

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

int pt=MarketInfo(Symbol(), MODE_POINT); // Размер пункта в валюте котировки

int dg=MarketInfo(Symbol(),MODE_DIGITS); // Количество цифр после десятичной точки в цене инструмента

int StLev=MarketInfo(Symbol(), MODE_STOPLEVEL); // Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах

double pa=MarketInfo(Symbol(), MODE_ASK); // Цена Аск

double pb=MarketInfo(Symbol(), MODE_BID); // Цена Бид

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

double slB=NormalizeDouble(pa-StopLoss*pt, dg); // Нормализация ценового уровня СтопЛосс для позиции Бай

double tpB=NormalizeDouble(pa+TakeProfit*pt, dg); // Нормализация ценового уровня ТейкПрофит для позиции Бай

double slS=NormalizeDouble(pb+StopLoss*pt, dg); // Нормализация ценового уровня СтопЛосс для позиции Селл

double tpS=NormalizeDouble(pb-TakeProfit*pt, dg); // Нормализация ценового уровня ТейкПрофит для позиции Селл

double SetB=NormalizeDouble(pa+SetOrderDistance*pt, dg); // Нормализация цены установки отложенного ордера Бай

double SetS=NormalizeDouble(pb-SetOrderDistance*pt, dg); // Нормализация цены установки отложенного ордера Селл

double slBS=NormalizeDouble(SetB-StopLoss*pt, dg); // Нормализация ценового уровня СтопЛосс отложенного ордера Бай

double tpBS=NormalizeDouble(SetB+TakeProfit*pt, dg); // Нормализация ценового уровня ТейкПрофит отложенного ордера Бай

double slSS=NormalizeDouble(SetS+StopLoss*pt, dg); // Нормализация ценового уровня СтопЛосс отложенного ордера Селл

double tpSS=NormalizeDouble(SetS-TakeProfit*pt, dg); // Нормализация ценового уровня ТейкПрофит отложенного ордера Селл

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Разбирайтесь... :)

И не забудьте о существовании СтопЛевел - int StLev=MarketInfo(Symbol(), MODE_STOPLEVEL);

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


Огромное спасибо!!! буду разбираться! )
 
Как создать функцию и вызвать ее?
 

переставил винду. перестало выскакивать окошко Alert. звуковое оповещение есть, запись в журнале есть, а плавающее окошко не выскакивает.

 терминал чистил, всё перекомпилял. в чем может быть причина?

 
_SS_:
Как создать функцию и вызвать ее?
В который раз уже повторяю - читайте учебник, изучайте матчасть... :)
 
artmedia70:
В который раз уже повторяю - читайте учебник, изучайте матчасть... :)
пробывал, не получается!
Причина обращения: