Und was ist der grundlegende Unterschied zwischen (1) und (2)? Warum liegt in einem Fall ein Fehler vor und im anderen Fall eine normale Situation?
So können Klassen innerhalb von Funktionen denselben Namen, aber unterschiedliche Inhalte haben. Bei der zweiten Variante ist die Signatur f nicht eindeutig.
Nach der ersten wird sie definiert. Und nach dem zweiten Mal wird sie nicht mit demselben Namen neu definiert.
Ich verdrehe den Code und kann nicht herausfinden, wie man den Mouwing einfärbt.
Wenn eine Farbe zunimmt und eine andere abnimmt.
Kann mir jemand ein Beispiel zeigen?
//+------------------------------------------------------------------+//| ColorMA.mq5 |//| Copyright 2018, MetaQuotes Software Corp. |//| https://mql5.com/ru/users/artmedia70 |//+------------------------------------------------------------------+#property copyright"Copyright 2018, MetaQuotes Software Corp."#property link"https://mql5.com/ru/users/artmedia70"#property version"1.00"#property description"Colored Moving Average"#property indicator_chart_window#property indicator_buffers2// Всего буферов 2 - рисуемый буфер и буфер цвета#property indicator_plots1// Один рисуемый буфер//--- plot ClrMA#property indicator_label1"Colored MA"#property indicator_type1DRAW_COLOR_LINE#property indicator_color1clrBlue,clrRed,clrDarkGray#property indicator_style1STYLE_SOLID#property indicator_width12//--- input parametersinputuint InpPeriod = 14; // Период расчётаinputENUM_MA_METHOD InpMethod = MODE_SMA; // Метод расчётаinputENUM_APPLIED_PRICE InpAppliedPrice = PRICE_CLOSE; // Цена расчёта//--- indicator buffersdouble BufferMA[]; // Рисуемый буферdouble BufferColors[]; // Буфер цвета//--- global variablesint period;
int handle_ma;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- set global variables
period=int(InpPeriod<1 ? 1 : InpPeriod);
//--- indicator buffers mappingSetIndexBuffer(0,BufferMA,INDICATOR_DATA); // Рисуемый буферSetIndexBuffer(1,BufferColors,INDICATOR_COLOR_INDEX); // Буфер цвета//--- setting indicator parametersIndicatorSetString(INDICATOR_SHORTNAME,"Colored MA");
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- setting buffer arrays as timeseriesArraySetAsSeries(BufferMA,true);
ArraySetAsSeries(BufferColors,true);
//--- create MA's handlesResetLastError();
handle_ma=iMA(NULL,PERIOD_CURRENT,period,0,InpMethod,InpAppliedPrice);
if(handle_ma==INVALID_HANDLE)
{
Print("Не удалось создать хэндл iMA(",(string)period,") ",EnumToString(InpAppliedPrice),". Ошибка: ",GetLastError());
returnINIT_FAILED;
}
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверка и расчёт количества просчитываемых баровif(rates_total<fmax(period,4)) return0; // три бара и меньше в расчёт не берём//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated;
if(limit>1)
{
/*
Почему больше 1. Например, загрузилась история, и разница будет больше одного.
Если все нормально, то разница rates_total-prev_calculated равна или 0, или 1
0 - пришел новый тик, новый бар формироваться не начал.
1 - пришел новый тик и начал формироваться новый бар
*/
limit=rates_total-2; // rates_total - это Bars для текущего символа и периода// Если не требуется проверять в цикле расчёта i+число, то limit=rates_total-1 (чтобы не вылететь за пределы массива), // иначе, если требуется проверять, например, i+period, то limit=rates_total-period-1ArrayInitialize(BufferMA,EMPTY_VALUE);
ArrayInitialize(BufferColors,2);
}
//--- Подготовка данных - в данном случае это и есть расчёт МА - копирование в буфер её значений из хэндлаint count=(limit>1 ? rates_total : 1); // если новый бар, то копируем всю доступную историю, иначе - только один текущийint copied=CopyBuffer(handle_ma,0,0,count,BufferMA);
if(copied!=count) return0; // Если скопировать не удалось - выходим до следующего тика//--- Установка цвета линииfor(int i=limit; i>=0 && !IsStopped(); i--)
{
// Тут всё просто: // У нас задано три цвета: #property indicator_color1 clrBlue,clrRed,clrDarkGray// 1. если МА на текущем баре выше чем МА на прошлом, то цвет под номером 0// 2. если МА на текущем баре ниже чем МА на прошлом, то цвет под номером 1// 3. иначе - цвет под номером 2 (в блоке инициализации в строке 86 задаётся этот цвет начальным для отображения линии, что, впрочем делать там не обязательно)
BufferColors[i]=(BufferMA[i]>BufferMA[i+1] ? 0 : BufferMA[i]<BufferMA[i+1] ? 1 : 2);
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+
Ich habe Ihnen ein etwas ungeschicktes Beispiel per E-Mail geschickt (ich habe die Copy-Paste-Fehler nicht korrigiert)
So können Klassen innerhalb von Funktionen denselben Namen, aber unterschiedliche Inhalte haben. Bei der zweiten Variante ist die Signatur f nicht eindeutig.
Hier ist alles gleich geblieben... und es funktioniert
#define CLASS \
class A { \
public: \
void f( int i ) { Print( i ); } \
int a; \
}
void g1() { CLASS a; a.f( 1 ); }
void g2() { CLASS a; a.f( 2 ); }
voidOnStart()
{
g1();
g2();
}
Das vorherige Beispiel in C++ funktioniert... so dass die Unterschriften dort irgendwie aussortiert werden.
Es gibt einen Fehler im Zigarrenservice. Wenn Sie die Hebelwirkung ändern, zeigt es das Gegenteil an. Wenn Sie ihn zum Beispiel von 1:500 auf 1:100 ändern, wird angezeigt, dass die Hebelwirkung von 1:100 auf 1:500 geändert wurde. Ich muss etwas dagegen tun... )
Die Situation hier ist also völlig anders - es gibt keine Vorlage.
Das vorherige Beispiel funktioniert in C++... die Unterschriften werden also irgendwie dort erledigt
Was gibt C++ hier preis?
template<typename T>
void f( T& ) { Print(__FUNCSIG__); }
void g1() { class A { int i; } a; f( a ); }
void g2() { class A { double d; } a; f( a ); }
Damit es in MQL5 funktioniert, sollte die Ausgabe zwei verschiedene Zeichenketten enthalten, nicht dieselbe. Aber der Mechanismus zur Erzeugung von Signaturen muss in diesem Fall ganz anders aussehen. Wenn C++ das gleiche Ergebnis in print erzeugt, sinkt der __FUNCSIG__-Wert drastisch.
Was ist der Unterschied?
SetIndexPuffer(1,WerteMalerei,INDICATOR_COLOR_INDEX);
и
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);
?
Ich verdrehe den Code und kann nicht herausfinden, wie man den Mouwing einfärbt.
Wenn eine Farbe zunimmt und eine andere abnimmt.
Kann mir jemand ein Beispiel zeigen?
Ich habe den Code durchgespielt und kann nicht herausfinden, wie man den Mouwing einfärbt.
Wenn eine Farbe steigt, fällt eine andere.
Kann mir jemand ein Beispiel zeigen?
Ich lerne gerade MQL5, aber es sollte so aussehen:
Was ist der grundlegende Unterschied zwischen (1) und (2)? Warum liegt in einem Fall ein Fehler und im anderen Fall ein normaler Fehler vor?
Und was ist der grundlegende Unterschied zwischen (1) und (2)? Warum liegt in einem Fall ein Fehler vor und im anderen Fall eine normale Situation?
So können Klassen innerhalb von Funktionen denselben Namen, aber unterschiedliche Inhalte haben. Bei der zweiten Variante ist die Signatur f nicht eindeutig.
Nach der ersten wird sie definiert. Und nach dem zweiten Mal wird sie nicht mit demselben Namen neu definiert.
Was ist der Unterschied?
SetIndexPuffer(1,WerteMalerei,INDICATOR_COLOR_INDEX);
и
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);
?
Ich verdrehe den Code und kann nicht herausfinden, wie man den Mouwing einfärbt.
Wenn eine Farbe zunimmt und eine andere abnimmt.
Kann mir jemand ein Beispiel zeigen?
Ich habe Ihnen ein etwas ungeschicktes Beispiel per E-Mail geschickt (ich habe die Copy-Paste-Fehler nicht korrigiert)
So können Klassen innerhalb von Funktionen denselben Namen, aber unterschiedliche Inhalte haben. Bei der zweiten Variante ist die Signatur f nicht eindeutig.
Hier ist alles gleich geblieben... und es funktioniert
Das vorherige Beispiel in C++ funktioniert... so dass die Unterschriften dort irgendwie aussortiert werden.
Was ist der grundlegende Unterschied zwischen (1)(2) und (3)(4)?
Hier ist alles dasselbe... und es funktioniert.
Die Situation hier ist also völlig anders - es gibt keine Vorlage.
Das vorherige Beispiel funktioniert in C++... die Unterschriften werden also irgendwie dort erledigt
Was gibt C++ hier preis?
Damit es in MQL5 funktioniert, sollte die Ausgabe zwei verschiedene Zeichenketten enthalten, nicht dieselbe. Aber der Mechanismus zur Erzeugung von Signaturen muss in diesem Fall ganz anders aussehen. Wenn C++ das gleiche Ergebnis in print erzeugt, sinkt der __FUNCSIG__-Wert drastisch.
Worauf lässt sich das folgende Verhalten zurückführen
Der Indikator "Kompilieren" funktioniert richtig, der Indikator "Erneut kompilieren" funktioniert nicht richtig. Funktioniert es im Testgerät korrekt?