[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 253
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Перенесено:
qaz2005 11.10.2011 09:30
Всем доброго дня! Подскажите пожалуйста, есть пользовательский индикатор, в нем есть два объекта. Значения их я могу узнать, но вот ни как не получается распознать их, то ли это верхняя линия или нижняя. Количество и порядок буферов узнать не могу, при установке нет ни каких настроек. В интернете вычитал что настройки по цвету тоже идут как буферы, как обратиться к ним через функцию iCustom() или может вообще какой другой функцией проработать этот момент?
Заранее спасибо!
P.S. Существует ли какая литература по языку MQL4? Учебник по MQL4 уже скачал и почти проработал.
номера буферов считаються с "0",
iCustom(NULL, 0,"ind",150, 0,2);
где 150 - это период,
0 - это буфер,
2 это бар.
https://docs.mql4.com/ru/indicators/iCustom
например
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
значит скорее всего, синий будет = 0 буферу
а красный =1ому
Александр! Спасибо, что поделились опытом! Но попутно у меня возник вопрос, как производится перебор валют? Или это и есть наименование валюты в ф-ии OrderSend() на месте Symbol()? И не могли бы Вы объяснить, как вписать в код Ваш пример? Еще раз спасибо за помощь! :)
Роман, в принципе объяснил.
Везде, где указан Symbol() в советнике, ставите, например: SymbolMax[nnnn]. В функции OrderSend() это выглядит так:tick=OrderSend(SymbolMax[nnnn],OP_BUYSTOP,L,ur,0,sl,tp,CMM,MAGIC[I],0,Red);
Я пишу, как в меня в советнике, а Вы уже сами там подставляйте, свои значения. И конечно, прописываете перечень валют, например:
string SymbolMax[4] = {"EURUSD", "GBPUSD", "USDCHF", "USDJPY"};
Может кто-то реализовал по другому, а у меня перебор валют так - см. код ниже. Поставил в начале функции старт. Плюс сделал 5-секундную задержку, чтобы сообщения не дрыгались.
у меня проблема с зацикливанием с использованием модификации,
модификацыя представленна как пользовательская функция
самое интересное функция стандартного трала работает с обоими из этих функций, по одиночке тоже нормально работает, а когода использую фрактальную модификацию с безубытком то начинаються безконечные модификации по фракталу и безубытку
за основу брал модификацию https://book.mql4.com/ru/trading/ordermodify
складываеться впечатление, что критерий для модификации безубытка, задан неверно, как это поправить чтобы небыло зацыкливания?
//ф-я модификации ордеров безубыток
int mod_b()
{
//--------------------------------------------------------------- 2 --
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
int Tip=OrderType(); // Тип ордера
if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер
double SL=OrderStopLoss(); // SL выбранного орд.
double TP =OrderTakeProfit(); // TP выбранного орд.
double Price =OrderOpenPrice(); // Цена выбранн. орд.
int Ticket=OrderTicket(); // Номер выбранн. орд.
//------------------------------------------------------ 3 --
while(true) // Цикл модификации
{
double TS=Tral_Stop; // Исходное значение
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист&&((SL<TS && Tip==0)||(SL>TS && Tip==1))
if (TS < Min_Dist) // Если меньше допуст.
TS=Min_Dist; // Новое значение TS
//--------------------------------------------------- 4 --
bool Modify=false; // Не назначен к модифи
switch(Tip) // По типу ордера
{
case 0 : // Ордер Buy
if (NormalizeDouble(SL,Digits)< // Если ниже желаем.
NormalizeDouble(Bid-TS*Point,Digits))
{
SL=Price+18*Point; // то модифицируем его
string Text="Buy "; // Текст для Buy
Modify=true; // Назначен к модифи.
}
break; // Выход из switch
case 1 : // Ордер Sell
if (NormalizeDouble(SL,Digits)> // Если выше желаем.
NormalizeDouble(Ask+TS*Point,Digits)
|| NormalizeDouble(SL,Digits)==0)//или равно нулю
{
SL=Price-18*Point; // то модифицируем его
Text="Sell "; // Текст для Sell
Modify=true; // Назначен к модифи.
}
} // Конец switch
if (Modify==false) // Если его не модифи
break; // Выход из while
//--------------------------------------------------- 5 --
Alert ("Модификация ",Text,Ticket,". Ждём ответ..");
bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
//--------------------------------------------------- 6 --
if (Ans==true) // Получилось :)
{
Alert ("Ордер ",Text,Ticket," модифицирован:)");
break; // Из цикла модифи.
}
{
//--------------------------------------------------------------- 2 --
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
int Tip=OrderType(); // Тип ордера
if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер
double SL=OrderStopLoss(); // SL выбранного орд.
//------------------------------------------------------обсчет фрактала
int f = 3; //номер бара с которого идет проверка наличия фрагтала
int DnN = 0, UpN = 0; //порядковый номер присвоен к направлению(upper, lower)
double UpFr = 0, DnFr = 0; //числовое значение фрагтала выраженное в еденице валюты присвоен к направлению(upper, lower)
while (f < Bars && (UpFr == 0 || DnFr == 0))
{
if (iFractals(Symbol(), 0, MODE_UPPER, f) != 0)
if (UpFr == 0)
{
UpFr = iFractals(Symbol(), 0, MODE_UPPER, f);//фрактальная отложка вверх(buy)
UpN = f;
}
if (iFractals(Symbol(), 0, MODE_LOWER, f) != 0)
if (DnFr == 0)
{
DnFr = iFractals(Symbol(), 0, MODE_LOWER, f);//фрактальная отложка вниз(sell)
DnN = f;
}
f++;
}
//------------------------------------------------------ 3 --
while(true) // Цикл модификации
{
double UD;
double TS=UD; // Исходное значение
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист
if(Tip==0)
UD=DnFr;
if(Tip==1)
UD=UpFr;
if (TS < Min_Dist) // Если меньше допуст.
TS=Min_Dist; // Новое значение TS
//--------------------------------------------------- 4 --
bool Modify=false; // Не назначен к модифи
switch(Tip) // По типу ордера
{
case 0 : // Ордер Buy
if (NormalizeDouble(SL,Digits)< // Если ниже желаем.
NormalizeDouble(UD,Digits))
{
SL=UD; // то модифицируем его
string Text="Buy "; // Текст для Buy
Modify=true; // Назначен к модифи.
}
break; // Выход из switch
case 1 : // Ордер Sell
if (NormalizeDouble(SL,Digits)> // Если выше желаем.
NormalizeDouble(UD,Digits)
|| NormalizeDouble(SL,Digits)==0)//или равно нулю
{
SL=UD; // то модифицируем его
Text="Sell "; // Текст для Sell
Modify=true; // Назначен к модифи.
}
} // Конец switch
if (Modify==false) // Если его не модифи
break; // Выход из while
//--------------------------------------------------- 5 --
double TP =OrderTakeProfit(); // TP выбранного орд.
double Price =OrderOpenPrice(); // Цена выбранн. орд.
int Ticket=OrderTicket(); // Номер выбранн. орд.
Alert ("Модификация ",Text,Ticket,". Ждём ответ..");
bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
//--------------------------------------------------- 6 --
if (Ans==true) // Получилось :)
{
Alert ("Ордер ",Text,Ticket," модифицирован:)");
break; // Из цикла модифи.
}
Здравствуйте уважаемые форумчане.
Подскажите как можно запросить котировки с других тайм-фреймов? У меня шаблон стоит на D и для индикатора нужны котировки LOW, HIGH, OPEN, CLOSE c более мелких тайм фреймов (М30, Н1, Н4 например).
Здравствуйте уважаемые форумчане.
Подскажите как можно запросить котировки с других тайм-фреймов? У меня шаблон стоит на D и для индикатора нужны котировки LOW, HIGH, OPEN, CLOSE c более мелких тайм фреймов (М30, Н1, Н4 например).
Всем добрый вечер. подскажите в чем здесь ошибка. вот кусок кода.
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
if (!IfTrueThenCountBarWork) return (0);
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
if (OrderMagicNumber() == 700000) <---- В ЭТОЙ СТРОКЕ ВЫДАЕТ ОШИБКУ!!!
CloseAfterSomeBar (CountBar, OrderTicket());
}
}
Всем добрый вечер. подскажите в чем здесь ошибка. вот кусок кода.
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
if (!IfTrueThenCountBarWork) return (0);
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
if (OrderMagicNumber() == 700000) <---- В ЭТОЙ СТРОКЕ ВЫДАЕТ ОШИБКУ!!!
CloseAfterSomeBar (CountBar, OrderTicket());
}
}
PapaYozh:
Пропущен символ ";"
спасибо!!! сразу и не заметил.)))
Еще вопрос к знатокам. как правельно сюда вписать условие открытия : Close[2]<Close[3] на n процентов, это для sell. для buy наоборот конечно. и чтоб это n можно было пооптимизировать? заранее спасибо!
void CheckForOpen()
{
double ma;
int res;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
if(Open[1]>ma && Close[1]<ma)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
return;
}
//---- buy conditions
if(Open[1]<ma && Close[1]>ma)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
return;
}
подскажите, где я ощибся плз... или это сам МТ4 даже так тупит, но у меня ордера Buy открываются только на High бара, а ордера Sell только на Close бара =) Хотя я в коде советника эти условия ну просто вообще не оговаривал =)