Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 145
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
ArraySort и для простых структур написать легко.
template <typename T>
void Swap( T &Value1, T &Value2 )
{
const T Tmp = Value1;
Value1 = Value2;
Value2 = Tmp;
}
// Сортировка массива любого простого типа
template <typename T>
bool MyArraySort( T &Array[] )
{
if (!ArraySort(Array))
{
const int Size = ArraySize(Array);
for (int i = 0; i < Size - 1; i++)
{
const T Tmp = Array[i];
for (int j = i + 1; j < Size; j++)
if (_R(Tmp) == Array[j]) // TypeToBytes.mqh
{
Swap(Array[i + 1], Array[j]);
i++;
}
}
}
return(true);
}
// Возвращает количество различных элементов массива, которых не меньше Repeat
template <typename T>
int Strange( const T &InArray[], const int Repeat = 2 )
{
int Res = 0;
T Array[];
const int Size = ArraySize(InArray);
if ((ArrayCopy(Array, InArray) == Size) && MyArraySort(Array))
{
int Tmp = 1;
for (int i = 1; i < Size; i++, Tmp++)
if (_R(Array[i - 1]) != Array[i]) // TypeToBytes.mqh
{
if (Tmp >= Repeat)
Res++;
Tmp = 0;
}
if (Tmp >= Repeat)
Res++;
}
return(Res);
}
void OnStart()
{
int Array[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
const int Size = ArraySize(Array);
MqlTick Ticks[], NullTick = {0};
ArrayResize(Ticks, Size);
for (int i = 0; i < Size; i++)
{
Ticks[i] = NullTick;
Ticks[i].time = Array[i];
}
for (int i = 1; i <= 4; i++)
{
Print(Strange(Array, i));
Print(Strange(Ticks, i));
}
}
Доброго вечера , прошу помощи по написанному советнику, если его можно так назвать.
В общем советник делает то, что я и ожидал от него. Но есть один непонятный глюк.
1) Он почему-то в некоторых случаях вместо отложников первым открывает Sell лотом 0,02. Хотя по сценарию он не должен. (где-то ошибка) . Не могу понять с чем это связано в , иногда все как по маслу а иногда первым вылетает Sell.
Прошу помочь с этой ошибкой. И если не трудно общие комментарии по написанию и моим ошибкам. Это мой первый советник можете строго судить .
//| ALEXANDROS_001.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input double perv_Lot=0.01;
input double shag1=40;
input double profit=20;
input double koredor=10;
input int magic=907;
input int slipage=10;
int ret,ORD=0,ic;
//
void OnTick()
{
//-----ищет цену последнего открытого ордера---------------------------------------------------------------
double OpenPrice = 0.0;
int orders=OrdersTotal();
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) { Print("Error in history!"); break; }
if(OrderSymbol()!=Symbol())continue;
if( OrderType()==OP_SELL||OrderType()==OP_BUY)
OpenPrice = OrderOpenPrice();
break;
}
//------если нет открытых позиций открывает два отложника------------------------------------------------------
int kolpos=0;
for (int pos=0; pos<OrdersTotal(); pos++)
{
OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==magic)
kolpos++;
}
if (kolpos==0)
{
OrderSend(Symbol(),OP_BUYSTOP,perv_Lot,Ask+shag1*Point,slipage,0,0,NULL,magic,0,clrGreen);
OrderSend(Symbol(),OP_SELLSTOP,perv_Lot,Bid-shag1*Point,slipage,0,0,NULL,magic,0,clrRed);
}
//--------------определяет если есть открытые позиции---------------------------------------------------------------------
int order=0;
for (int pos=0; pos<OrdersTotal(); pos++)
{
OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==magic)
if(OrderType()==OP_SELL||OrderType()==OP_BUY) //если это продажи или покупки считаем что сделки открыты
order++;
}
if(order>0)
//--------------- находит и удаляет отложки.---------------------------------------------------------------
{
for(ic=OrdersTotal()-1;ic>=0;ic--)
{
if(OrderSelect(ic,SELECT_BY_POS,MODE_TRADES)==false) continue;
if (OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)//если это отложки то удаляем
{
ret=OrderDelete(OrderTicket());//удалил отложки
}
}}
//--------------ищем последний открытый ордер-------------------------------------
for(ic=OrdersTotal()-1;ic>=0;ic--)
{
if(OrderSelect(ic,SELECT_BY_POS,MODE_TRADES)==false) continue;
if (OrderSymbol()==Symbol()&&OrderMagicNumber()==magic&&OrderOpenPrice()==OpenPrice)
{
double minus=NormalizeDouble( Ask-OpenPrice,Digits);
double plus= NormalizeDouble(Ask-OpenPrice,Digits);
if(Digits==3)
{
minus=minus*100;
plus=plus*100;
}
if(Digits==5)
{
minus=minus*10000;
plus=plus*10000;
}
//-------------если последний открытый ордер SELL--------------------------------------------------------------
if (OrderType()==OP_SELL)
{
if(plus<=-profit)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,slipage,0);
if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,slipage,0);
}
}
//---------------а если цена пошла в минус---------------------------------------------------------------------------
if( minus>=koredor)
{
double Lot=OrderLots();
OrderSend(Symbol(),OP_BUY,Lot*2,Ask,slipage,0,0,NULL,magic,0,clrRed);// открываем BUY с удвоеным лотом
}
}
double minusbuy=NormalizeDouble(Ask-OpenPrice,Digits);
double plusbuy=NormalizeDouble(Ask-OpenPrice,Digits);
if(Digits==3)
{
minusbuy=minusbuy*100;
plusbuy=plusbuy*100;
}
if(Digits==5)
{
minusbuy=minusbuy*10000;
plusbuy=plusbuy*10000;
}
//-----------------если последний ордер Buy--------------------------------------------------------------------------------
if (OrderType()==OP_BUY)
{
if(plusbuy>=profit)//-------если цена пошла в плюс-------------------------------------------------------
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);//---находим и закрываем все открытые ордера--------------------
if(OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,slipage,0);
if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,slipage,0);
}
}
//-----------------------------а если цена пошла в минус------------------------------------------------------------------
if(minusbuy<=-koredor)
{
Comment("Ордеров -",order);
double Lot=OrderLots();
OrderSend(Symbol(),OP_SELL,Lot*2,Bid,slipage,0,0,NULL,magic,0,clrRed);//открываем ордер SELL с удвоенным лотом----
}
}
}}}}
Доброго вечера , прошу помощи по написанному советнику, если его можно так назвать.
В общем советник делает то, что я и ожидал от него. Но есть один непонятный глюк.
1) Он почему-то в некоторых случаях вместо отложников первым открывает Sell лотом 0,02. Хотя по сценарию он не должен. (где-то ошибка) . Не могу понять с чем это связано в , иногда все как по маслу а иногда первым вылетает Sell.
Прошу помочь с этой ошибкой. И если не трудно общие комментарии по написанию и моим ошибкам. Это мой первый советник можете строго судить .
Сначала используйте стилизатор (Ctrl+,) и исправьте все замечания, которые выдал компилятор, их там много.
Потом, вот это:
double plusbuy=NormalizeDouble(Ask-OpenPrice,Digits);
if(Digits==3)
{
minusbuy=minusbuy*100;
plusbuy=plusbuy*100;
}
if(Digits==5)
{
minusbuy=minusbuy*10000;
plusbuy=plusbuy*10000;
}
легко и непринуждённо меняется на это:
double minusbuy=NormalizeDouble((Ask-OpenPrice)/_Point,Digits);
double plusbuy=minusbuy;
Аналогично и выше по коду.
Хотя непонятно, зачем считается по Аск и для покупок, и для продаж, да и расчёты производятся ДО того, как определился тип ордера. Да и OpenPrice как-то далековато определяется, аж на несколько циклов раньше.
Сначала используйте стилизатор (Ctrl+,) и исправьте все замечания, которые выдал компилятор, их там много.
Потом, вот это:
double plusbuy=NormalizeDouble(Ask-OpenPrice,Digits);
if(Digits==3)
{
minusbuy=minusbuy*100;
plusbuy=plusbuy*100;
}
if(Digits==5)
{
minusbuy=minusbuy*10000;
plusbuy=plusbuy*10000;
}
легко и непринуждённо меняется на это:
double minusbuy=NormalizeDouble((Ask-OpenPrice)/_Point,Digits);
double plusbuy=minusbuy;
Аналогично и выше по коду.
Хотя непонятно, зачем считается по Аск и для покупок, и для продаж, да и расчёты производятся ДО того, как определился тип ордера. Да и OpenPrice как-то далековато определяется, аж на несколько циклов раньше.
Спасибо, попробую исправить.
Приветствую. Подскажите почему при тестировании пишет " cannot open file 'E:\MT4-1\Alpari Limited MT4\MQL4\indicators\Параметры индикатора WmiFor.ex4' [2] " ?
Индикатор есть, работает. https://www.mql5.com/ru/code/10394
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
extern string WmiFor = "Параметры индикатора WmiFor";
extern bool IsTopCorner = true; // Информационный блок в верхнем углу?
extern int Offset = 1; // Смещение исходного образца в барах (для проверки надежности прогноза) [1..]
extern bool IsOffsetStartFixed = true; // Фиксировано ли начало образца
extern bool IsOffsetEndFixed = false; // Фиксирован ли конец образца
extern int PastBars = 24; // Размер образца в барах, который ищется на истории [3..]
extern int ForecastBars = 24; // На сколько баров вперед делать прогноз [1..]
extern int MaxAlts = 5; // Искать указанное кол-во лучших образцов [1..100]
extern bool ShowCloud = true; // Показывать ли облако
extern bool ShowBestPattern = true; // Показывать ли максимально близкий образец
extern bool IsExactTime = true; // Должно ли совпадать время образцов (для учета эффекта сессий)
extern datetime MinDate = D'01.01.2001'; // Минимальная дата образца
extern int PeriodMA = 2; // Периуд сглаженной средней
extern double ScalePercents = 90.0; // Рассматривать только образцы с этим минимальным процентом совпадения
extern color IndicatorCloudColor = Sienna; // Цвет облака похожих вариантов
extern color IndicatorBestPatternColor = DodgerBlue; // Цвет самого похожего образца
extern color IndicatorVLinesColor = Sienna; // Цвет вертикальных линий-границ образца
extern color IndicatorTextColor = MediumBlue; // Цвет текста инф.блока
extern color IndicatorTextWarningColor = Tomato; // Цвет предупреждений в тестовом инф.блоке
extern int XCorner = 5; // Отступ инф.блока индикатора от правой границы графика
extern int YCorner = 5; // Отступ инф.блока индикатора от верхней границы графика
extern string FontName = "Arial"; // Шрифт тестового инф.блока
extern int FontSize = 7; // Размер шрифта тестового инф.блока
double Index0, Index1, Index2, Index3, Index4, Index5;
void OnTick()
{
Index0 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 0, 3);
Index1 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 1, 3);
Index2 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 2, 3);
Index3 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 3, 3);
Index4 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 4, 3);
Index5 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 5, 3);
Comment ( "0==", DoubleToString(Index0,Digits), " 1==", DoubleToString(Index1,Digits), " 2==", DoubleToString(Index2,Digits),
" 3==", DoubleToString(Index3,Digits)," 4==", DoubleToString (Index4, Digits), " 5==", DoubleToString (Index5, Digits));
}
//+------------------------------------------------------------------+
Приветствую. Подскажите почему при тестировании пишет " cannot open file 'E:\MT4-1\Alpari Limited MT4\MQL4\indicators\Параметры индикатора WmiFor.ex4' [2] " ?
Индикатор есть, работает. https://www.mql5.com/ru/code/10394
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
extern string WmiFor = "Параметры индикатора WmiFor";
void OnTick()
{
Index5 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 5, 3);
Comment ( "0==", DoubleToString(Index0,Digits), " 1==", DoubleToString(Index1,Digits), " 2==", DoubleToString(Index2,Digits),
" 3==", DoubleToString(Index3,Digits)," 4==", DoubleToString (Index4, Digits), " 5==", DoubleToString (Index5, Digits));
}
//+------------------------------------------------------------------+
Почитайте в документации о "iCustom", и как правильно достучаться к индикатору
Спасиб.
Я кавычки забыл, лошара.
Добрый день!
Помогите разобраться что не так. Мне нужно чтобы в момент пересечении линии баром выводилась цена. Я написал код.
int start() {
double pr=ObjectGetValueByShift("line",0);
Alert (pr);
return(0);}
line - название линии.
Этот код всегда показывает "0". Что не так?
Добрый день!
Помогите разобраться что не так. Мне нужно чтобы в момент пересечении линии баром выводилась цена. Я написал код.
int start() {
double pr=ObjectGetValueByShift("line",0);
Alert (pr);
return(0);}
line - название линии.
Этот код всегда показывает "0". Что не так?
У вас Трендовая линия?
И визуально проходит над(под) 0 баром, нет, поставте галочку в свойсвах, луч.
Всем добрый день!
Вопросик, На инсте при попытке отправить ордер, пишет, что неправильные стопы.
вот сама строка:
OrderSend(Symbol(),OP_BUYSTOP,Lots,HiP,3,0,0,NULL,111,0,clrBlue);
В стоплоссе и тейке стоит 0. Если в Стоплосс ставить число, то всё норм.
А мне не нужен стоплосс. Как быть?