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)) { constint 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[], constint Repeat = 2 ) { int Res = 0 ;
T Array[];
constint 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++;
externstring WmiFor = "Параметры индикатора WmiFor" ; externbool IsTopCorner = true ; // Информационный блок в верхнем углу? externint Offset = 1 ; // Смещение исходного образца в барах (для проверки надежности прогноза) [1..] externbool IsOffsetStartFixed = true ; // Фиксировано ли начало образца externbool IsOffsetEndFixed = false ; // Фиксирован ли конец образца externint PastBars = 24 ; // Размер образца в барах, который ищется на истории [3..] externint ForecastBars = 24 ; // На сколько баров вперед делать прогноз [1..] externint MaxAlts = 5 ; // Искать указанное кол-во лучших образцов [1..100] externbool ShowCloud = true ; // Показывать ли облако externbool ShowBestPattern = true ; // Показывать ли максимально близкий образец externbool IsExactTime = true ; // Должно ли совпадать время образцов (для учета эффекта сессий) externdatetime MinDate = D'01.01.2001' ; // Минимальная дата образца externint PeriodMA = 2 ; // Периуд сглаженной средней externdouble ScalePercents = 90.0 ; // Рассматривать только образцы с этим минимальным процентом совпадения externcolor IndicatorCloudColor = Sienna; // Цвет облака похожих вариантов externcolor IndicatorBestPatternColor = DodgerBlue; // Цвет самого похожего образца externcolor IndicatorVLinesColor = Sienna; // Цвет вертикальных линий-границ образца externcolor IndicatorTextColor = MediumBlue; // Цвет текста инф.блока externcolor IndicatorTextWarningColor = Tomato; // Цвет предупреждений в тестовом инф.блоке externint XCorner = 5 ; // Отступ инф.блока индикатора от правой границы графика externint YCorner = 5 ; // Отступ инф.блока индикатора от верхней границы графика externstring FontName = "Arial" ; // Шрифт тестового инф.блока externint FontSize = 7 ; // Размер шрифта тестового инф.блока
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) 어떤 경우에는 평신도가 아닌 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) 어떤 경우에는 평신도가 아닌 0.02로 많이 매도를 여는 경우가 있습니다. 대본에 따르면, 그는해서는 안됩니다. (어딘가 오류). 이게 무슨 연관이 있는지 이해가 안 가는데, 때로는 모든 것이 시계처럼 작동하고 때로는 Sell이 먼저 충돌하기도 합니다.
이 오류를 도와주세요. 그리고 쓰기와 내 실수에 대한 어려운 일반적인 의견이 아니라면. 이것은 나의 첫 번째 조언자이며 엄격하게 판단 할 수 있습니다.
먼저 스타일러(Ctrl+,)를 이용해서 컴파일러가 내뱉은 지적을 모두 수정하세요.
P그들은 다음과 같습니다.
double plusbuy= NormalizeDouble ( Ask -OpenPrice, Digits );
if ( Digits == 3 )
{
minusbuy=minusbuy* 100 ;
plusbuy=plusbuy* 100 ;
}
if ( Digits == 5 )
{
minusbuy=minusbuy* 10000 ;
plusbuy=plusbuy* 10000 ;
}
l 쉽고 자연스럽게 다음과 같이 변경됩니다.
double minusbuy= NormalizeDouble (( Ask -OpenPrice)/ _Point , Digits );
double plusbuy=minusbuy;
A는 유사하고 코드에서 더 높습니다.
왜 Ask가 구매와 판매 모두에 대해 계산되는지 명확하지 않지만 계산은 주문 유형이 결정되기 전에 이루어집니다. 예, OpenPrice는 몇 사이클 더 일찍 어떻게든 멀리 결정됩니다.
먼저 스타일러(Ctrl+,)를 이용해서 컴파일러가 내뱉은 지적을 모두 수정하세요.
P그들은 다음과 같습니다.
double plusbuy= NormalizeDouble ( Ask -OpenPrice, Digits );
if ( Digits == 3 )
{
minusbuy=minusbuy* 100 ;
plusbuy=plusbuy* 100 ;
}
if ( Digits == 5 )
{
minusbuy=minusbuy* 10000 ;
plusbuy=plusbuy* 10000 ;
}
l 쉽고 자연스럽게 다음과 같이 변경됩니다.
double minusbuy= NormalizeDouble (( Ask -OpenPrice)/ _Point , Digits );
double plusbuy=minusbuy;
A는 유사하고 코드에서 더 높습니다.
왜 Ask가 구매와 판매 모두에 대해 계산되는지 명확하지 않지만 계산은 주문 유형이 결정되기 전에 이루어집니다. 예, OpenPrice는 몇 사이클 더 일찍 어떻게든 멀리 결정됩니다.
감사합니다. 해결해 보겠습니다.
인사말. 테스트할 때 "'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 ));
}
//+------------------------------------------------------------------+
인사말. 테스트할 때 "'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 " 및 표시기에 올바르게 액세스하는 방법에 대한 설명서를 읽으십시오.
감사해요.
인용문을 잊어버렸어, 로샤라.
안녕하세요!
무엇이 잘못되었는지 알아내도록 도와주세요. 선이 교차할 때 가격을 표시할 막대가 필요합니다. 코드를 작성했습니다.
정수 시작() {
이중 pr=ObjectGetValueByShift("줄", 0);
경고 (pr);
반환(0);}
라인 - 라인 이름.
이 코드는 항상 "0"을 표시합니다. 뭐가 문제 야?
안녕하세요!
무엇이 문제인지 알아낼 수 있도록 도와주세요. 선이 교차할 때 가격을 표시할 막대가 필요합니다. 코드를 작성했습니다.
정수 시작() {
이중 pr=ObjectGetValueByShift("줄", 0);
경고(pr);
반환(0);}
라인 - 라인 이름.
이 코드는 항상 "0"을 표시합니다. 뭐가 문제 야?
추세선이 있습니까?
그리고 그것은 시각적으로 0 막대를 (아래) 통과합니다. 아니요, 속성에 눈금을 표시하십시오. 빔.
좋은 오후에요 여러분!
질문, Instagram에서 주문을 보내 려고 할 때 정류장이 잘못되었다고 표시됩니다.
라인 자체에서:
OrderSend(Symbol(),OP_BUYSTOP,Lots,HiP,3,0,0,NULL,111,0,clrBlue);
손절매에서는 0입니다. 손절매에 숫자를 넣으면 모든 것이 정상입니다.
A 손절매는 필요하지 않습니다. 어떻게 될 것인가?