Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Хочу собрать ПК для работы с МТ 5, что посоветуете и...
Nachmittags. Ich kann ein Fibo-Objekt(OBJ_FIBO) in MT-4 nicht zeichnen, ohne die Linien nach rechts zu verlängern. Wenn Sie den Parameter OBJPROP_RAY_RIGHT ändern, wird der Strahl weiterhin ganz nach rechts gezeichnet. Und das Skript aus dem Lernprogramm verhält sich genauso. Ich habe versucht, es in OBJPROP_RAY für das Segment zu ändern, aber es funktioniert nicht. Können Sie den Grund dafür erklären? Ich danke Ihnen im Voraus.
Sergey Fionin: Nachmittags. Ich kann ein Fibo-Objekt (OBJ_FIBO) in MT-4 nicht zeichnen, ohne die Linien nach rechts zu verlängern. Wenn Sie den Parameter OBJPROP_RAY_RIGHT ändern, wird der Strahl weiterhin ganz nach rechts gezeichnet. Und das Skript aus dem Lernprogramm verhält sich genauso. Ich habe versucht, es in OBJPROP_RAY für das Segment zu ändern, aber es funktioniert nicht. Können Sie den Grund dafür erklären? Ich danke Ihnen im Voraus.
Das Problem ist, dass MT4 nicht MT5 ist, und wenn der Code kompiliert wird, bedeutet das nicht, dass er auch funktioniert.
Tatsache ist, dass MT4 nicht MT5 ist, und wenn der Code kompiliert wird, bedeutet dies nicht, dass er funktioniert.
Ich verstehe. Und deshalb frage ich, ob die Einstellung " Fortsetzung des Objekts nach rechts" mittels OBJPROP_RAY_RIGHT wirklich im MT-4 für ( OBJ_FIBO ) funktioniert ? Ein Beispiel für ein Skriptstammt aus einem Lehrbuch für mt-4.
#property strict//--- описание #property description"Скрипт строит графический объект \"Уровни Фибоначчи\"."#property description"Координаты точек привязки задаются в процентах от"#property description"размеров окна графика."//--- покажем окно входных параметров при запуске скрипта #property script_show_inputs//--- входные параметры скрипта inputstring InpName= "FiboLevels" ; // Имя объекта inputint InpDate1= 10 ; // Дата 1-ой точки в % inputint InpPrice1= 65 ; // Цена 1-ой точки в % inputint InpDate2= 90 ; // Дата 2-ой точки в % inputint InpPrice2= 85 ; // Цена 2-ой точки в % inputcolor InpColor= clrRed ; // Цвет объекта inputENUM_LINE_STYLE InpStyle= STYLE_DASHDOTDOT ; // Стиль линии inputint InpWidth= 1 ; // Толщина линии inputbool InpBack= false ; // Объект на заднем плане inputbool InpSelection= true ; // Выделить для перемещений inputbool InpRayRight= false ; // Продолжение объекта вправо inputbool InpHidden= true ; // Скрыт в списке объектов inputlong InpZOrder= 0 ; // Приоритет на нажатие мышью //+------------------------------------------------------------------+ //| Cоздает "Уровни Фибоначчи" по заданным координатам | //+------------------------------------------------------------------+ bool FiboLevelsCreate( constlong chart_ID= 0 , // ID графика conststring name= "FiboLevels" , // имя объекта constint sub_window= 0 , // номер подокна datetime time1= 0 , // время первой точки double price1= 0 , // цена первой точки datetime time2= 0 , // время второй точки double price2= 0 , // цена второй точки constcolor clr= clrRed , // цвет объекта constENUM_LINE_STYLE style= STYLE_SOLID , // стиль линии объекта constint width= 1 , // толщина линии объекта constbool back= false , // на заднем плане constbool selection= true , // выделить для перемещений constbool ray_right= false , // продолжение объекта вправо constbool hidden= true , // скрыт в списке объектов constlong z_order= 0 ) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeFiboLevelsEmptyPoints(time1,price1,time2,price2);
//--- сбросим значение ошибки ResetLastError ();
//--- создадим "Уровни Фибоначчи" по заданным координатам if (! ObjectCreate (chart_ID,name, OBJ_FIBO ,sub_window,time1,price1,time2,price2))
{
Print ( __FUNCTION__ ,
": не удалось создать \"Уровни Фибоначчи\"! Код ошибки = " , GetLastError ());
return ( false );
}
//--- установим цвет ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
//--- установим стиль линии ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style);
//--- установим толщину линии ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,width);
//--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
//--- включим (true) или отключим (false) режим выделения объекта для перемещений //--- при создании графического объекта функцией ObjectCreate, по умолчанию объект //--- нельзя выделить и перемещать. Внутри же этого метода параметр selection //--- по умолчанию равен true, что позволяет выделять и перемещать этот объект ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
//--- включим (true) или отключим (false) режим продолжения отображения объекта вправо ObjectSetInteger (chart_ID,name, OBJPROP_RAY_RIGHT ,ray_right);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
//--- установи приоритет на получение события нажатия мыши на графике ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
//--- успешное выполнение return ( true );
}
//+------------------------------------------------------------------+ //| Задает количество уровней и их параметры | //+------------------------------------------------------------------+ bool FiboLevelsSet( int levels, // количество линий уровня double &values[], // значения линий уровня color &colors[], // цвет линий уровня ENUM_LINE_STYLE &styles[], // стиль линий уровня int &widths[], // толщина линий уровня constlong chart_ID= 0 , // ID графика conststring name= "FiboLevels" ) // имя объекта
{
//--- проверим размеры массивов if (levels!= ArraySize (colors) || levels!= ArraySize (styles) ||
levels!= ArraySize (widths) || levels!= ArraySize (widths))
{
Print ( __FUNCTION__ , ": длина массива не соответствует количеству уровней, ошибка!" );
return ( false );
}
//--- установим количество уровней ObjectSetInteger (chart_ID,name, OBJPROP_LEVELS ,levels);
//--- установим свойства уровней в цикле for ( int i= 0 ;i<levels;i++)
{
//--- значение уровня ObjectSetDouble (chart_ID,name, OBJPROP_LEVELVALUE ,i,values[i]);
//--- цвет уровня ObjectSetInteger (chart_ID,name, OBJPROP_LEVELCOLOR ,i,colors[i]);
//--- стиль уровня ObjectSetInteger (chart_ID,name, OBJPROP_LEVELSTYLE ,i,styles[i]);
//--- толщина уровня ObjectSetInteger (chart_ID,name, OBJPROP_LEVELWIDTH ,i,widths[i]);
//--- описание уровня ObjectSetString (chart_ID,name, OBJPROP_LEVELTEXT ,i, DoubleToString ( 100 *values[i], 1 ));
}
//--- успешное выполнение return ( true );
}
//+------------------------------------------------------------------+ //| Перемещает точку привязки "Уровней Фибоначчи" | //+------------------------------------------------------------------+ bool FiboLevelsPointChange( constlong chart_ID= 0 , // ID графика conststring name= "FiboLevels" , // имя объекта constint point_index= 0 , // номер точки привязки datetime time= 0 , // координата времени точки привязки double price= 0 ) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid if (!time)
time= TimeCurrent ();
if (!price)
price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- сбросим значение ошибки ResetLastError ();
//--- переместим точку привязки if (! ObjectMove (chart_ID,name,point_index,time,price))
{
Print ( __FUNCTION__ ,
": не удалось переместить точку привязки! Код ошибки = " , GetLastError ());
return ( false );
}
//--- успешное выполнение return ( true );
}
//+------------------------------------------------------------------+ //| Удаляет "Уровни Фибоначчи" | //+------------------------------------------------------------------+ bool FiboLevelsDelete( constlong chart_ID= 0 , // ID графика conststring name= "FiboLevels" ) // имя объекта
{
//--- сбросим значение ошибки ResetLastError ();
//--- удалим объект if (! ObjectDelete (chart_ID,name))
{
Print ( __FUNCTION__ ,
": не удалось удалить \"Уровни Фибоначчи\"! Код ошибки = " , GetLastError ());
return ( false );
}
//--- успешное выполнение return ( true );
}
//+------------------------------------------------------------------+ //| Проверяет значения точек привязки "Уровней Фибоначчи" и для | //| пустых значений устанавливает значения по умолчанию | //+------------------------------------------------------------------+ void ChangeFiboLevelsEmptyPoints( datetime &time1, double &price1,
datetime &time2, double &price2)
{
//--- если время второй точки не задано, то она будет на текущем баре if (!time2)
time2= TimeCurrent ();
//--- если цена второй точки не задана, то она будет иметь значение Bid if (!price2)
price2= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- если время первой точки не задано, то она лежит на 9 баров левее второй if (!time1)
{
//--- массив для приема времени открытия 10 последних баров datetime temp[ 10 ];
CopyTime ( Symbol (), Period (),time2, 10 ,temp);
//--- установим первую точку на 9 баров левее второй
time1=temp[ 0 ];
}
//--- если цена первой точки не задана, то сдвинем ее на 200 пунктов ниже второй if (!price1)
price1=price2- 200 * SymbolInfoDouble ( Symbol (), SYMBOL_POINT );
}
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ voidOnStart ()
{
//--- проверим входные параметры на корректность if (InpDate1< 0 || InpDate1> 100 || InpPrice1< 0 || InpPrice1> 100 ||
InpDate2< 0 || InpDate2> 100 || InpPrice2< 0 || InpPrice2> 100 )
{
Print ( "Ошибка! Некорректные значения входных параметров!" );
return ;
}
//--- количество видимых баров в окне графика int bars=( int ) ChartGetInteger ( 0 , CHART_VISIBLE_BARS );
//--- размер массива price int accuracy= 1000 ;
//--- массивы для хранения значений дат и цен, которые будут использованы //--- для установки и изменения координат точек привязки "Уровней Фибоначчи" datetime date[];
double price[];
//--- выделение памяти ArrayResize (date,bars);
ArrayResize (price,accuracy);
//--- заполним массив дат ResetLastError ();
if ( CopyTime ( Symbol (), Period (), 0 ,bars,date)==- 1 )
{
Print ( "Не удалось скопировать значения времени! Код ошибки = " , GetLastError ());
return ;
}
//--- заполним массив цен //--- найдем максимальное и минимальное значение графика double max_price= ChartGetDouble ( 0 , CHART_PRICE_MAX );
double min_price= ChartGetDouble ( 0 , CHART_PRICE_MIN );
//--- определим шаг изменения цены и заполним массив double step=(max_price-min_price)/accuracy;
for ( int i= 0 ;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования "Уровней Фибоначчи" int d1=InpDate1*(bars- 1 )/ 100 ;
int d2=InpDate2*(bars- 1 )/ 100 ;
int p1=InpPrice1*(accuracy- 1 )/ 100 ;
int p2=InpPrice2*(accuracy- 1 )/ 100 ;
//--- создадим объект if (!FiboLevelsCreate( 0 ,InpName, 0 ,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpRayRight,InpHidden,InpZOrder))
{
return ;
}
//--- перерисуем график и подождем 1 секунду ChartRedraw ();
Sleep ( 1000 );
//--- теперь будем перемещать точки привязки //--- счетчик цикла int v_steps=accuracy* 2 / 5 ;
//--- перемещаем первую точку привязки for ( int i= 0 ;i<v_steps;i++)
{
//--- возьмем следующее значение if (p1> 1 )
p1-= 1 ;
//--- сдвигаем точку if (!FiboLevelsPointChange( 0 ,InpName, 0 ,date[d1],price[p1]))
return ;
//--- проверим факт принудительного завершения скрипта if ( IsStopped ())
return ;
//--- перерисуем график ChartRedraw ();
}
//--- задержка в 1 секунду Sleep ( 1000 );
//--- счетчик цикла
v_steps=accuracy* 4 / 5 ;
//--- перемещаем вторую точку привязки for ( int i= 0 ;i<v_steps;i++)
{
//--- возьмем следующее значение if (p2> 1 )
p2-= 1 ;
//--- сдвигаем точку if (!FiboLevelsPointChange( 0 ,InpName, 1 ,date[d2],price[p2]))
return ;
//--- проверим факт принудительного завершения скрипта if ( IsStopped ())
return ;
//--- перерисуем график ChartRedraw ();
}
//--- задержка в 1 секунду Sleep ( 1000 );
//--- удалим объект с графика
FiboLevelsDelete( 0 ,InpName);
ChartRedraw ();
//--- задержка в 1 секунду Sleep ( 1000 );
//---
}
Das verstehe ich. Deshalb frage ich, ob die Einstellung "Objekt nach rechts weiterführen" mit OBJPROP_RAY_RIGHT in mt-4 für (OBJ_FIBO) wirklich funktioniert? Das Beispielskriptstammt aus dem Tutorium für mt-4.
Es ist möglich, dass sie es bei der Bearbeitung der Hilfe übersehen haben. Dies wurde in der mql5-Dokumentation korrigiert.
Hallo zusammen. Vor einer Woche habe ich angefangen, mich mit mql zu beschäftigen, und jetzt rätsele ich darüber, wie ich einen solchen Mechanismus implementieren kann. Das Diagramm hat eine Schaltfläche(OBJ_BUTTON), wie und was sollte in den Code geschrieben werden, so dass, wenn Sie auf die Schaltfläche klicken würde von einer bestimmten Folge von Zahlen in Ordnung abgeleitet werden. Das heißt, es gibt eine Folge von 2, 4, 8, 16, 32, 64, 128. Ich drücke z.B. die Taste auf dem Diagramm und die Zahl aus dieser Folge soll in einem Kommentar angezeigt werden, streng in der Reihenfolge. Ich habe die Taste gedrückt - es wird 2 angezeigt, ich habe sie erneut gedrückt - es wird 4 angezeigt und so weiter. Drückt man beispielsweise die zweite Taste, erscheinen diese Zahlen in umgekehrter Reihenfolge. Wenn Sie einen funktionierenden Code schreiben können, wird meine Freude vorbei sein)))
Ivan Revedzhuk: Hallo zusammen. Es ist eine Woche her, dass ich angefangen habe, mich mit mql zu beschäftigen, und ich habe darüber nachgedacht, wie man einen solchen Mechanismus implementieren kann. Das Diagramm hat eine Schaltfläche (OBJ_BUTTON), wie und was sollte in den Code geschrieben werden, um eine Zahl aus einer bestimmten Sequenz in der Reihenfolge zu drucken, wenn Sie auf die Schaltfläche klicken. Das heißt, es gibt eine Folge von 2, 4, 8, 16, 32, 64, 128. Ich drücke z.B. die Taste auf dem Diagramm und die Zahl aus dieser Folge soll in einem Kommentar angezeigt werden, streng in der Reihenfolge. Ich habe die Taste gedrückt - es wird 2 angezeigt, ich habe sie erneut gedrückt - es wird 4 angezeigt und so weiter. Drückt man beispielsweise die zweite Taste, erscheinen diese Zahlen in umgekehrter Reihenfolge. Wenn Sie einen funktionierenden Code schreiben können, wird meine Freude vorbei sein)))
if(ObjectGetInteger(0, "name", OBJPROP_STATE) == true)
// Кнопка нажата// Вывести в Comment какое нужно число
// Отжать кнопкуObjectSetInteger(0, "name", OBJPROP_STATE) == false
Lesen Sie die Dokumentation des Diagramms, um herauszufinden, welche Zahl in dem Kommentar steht. Dort gibt es eine Funktion zum Lesen des Kommentars.
Oder die einfachste, diese Zahl in eine statische Variable zu setzen, und es in Comment()
Lesen Sie die Dokumentation des Diagramms, um herauszufinden, welche Zahl in dem Kommentar steht. Dort gibt es eine Funktion zum Lesen des Kommentars.
Am einfachsten ist es, diese Zahl in eine statische Variable zu packen und in Comment() einzugeben
Vielen Dank für die Antwort. Ich habe in der Hilfe herausgefunden, wie man das Drücken von Tasten behandelt, aber ich habe Probleme mit dem Rest. Ich arbeite nicht nur mit einer Zahl, sondern mit einer Folge von ganzen Zahlen, und ich brauche einen Tastendruck, um eine Zahl aus dieser Folge auszugeben, in der Reihenfolge von 2 bis 128. Die Frage ist nur, wie man das genau macht...
@ Artyom Trishkin
Können Sie bitte meine Frage beantworten? Ich glaube nicht, dass das jemanden interessiert.
Versuchen Sie, Ihre Frage hier zu stellen:
Hallo.
Ich bin ein Neuling und habe das erste Problem - warum gibt die Kompilierung einen Fehler? Wie kann man das beheben?
//+------------------------------------------------------------------+
//|moy var1.mq4 |
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#Eigenschaft Version "1.00"
#Eigenschaft streng
extern int Magic = 111;
int CountSell()
//+------------------------------------------------------------------+
//|Experten-Initialisierungsfunktion|
//+-----------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
{
{
int count =0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
zählen++;
}
}
Rückkehr;
}
}
//+------------------------------------------------------------------+
'int' - Semikolon erwartet moy var1.mq4 13 1
1 Fehler, 0 Warnung(en) 2 1
Hallo.
Ich bin ein Neuling und habe das erste Problem - warum gibt die Kompilierung einen Fehler? Wie kann man das beheben?
//+------------------------------------------------------------------+
Bitte geben Sie den Code korrekt ein:
Nachmittags. Ich kann ein Fibo-Objekt (OBJ_FIBO) in MT-4 nicht zeichnen, ohne die Linien nach rechts zu verlängern. Wenn Sie den Parameter OBJPROP_RAY_RIGHT ändern, wird der Strahl weiterhin ganz nach rechts gezeichnet. Und das Skript aus dem Lernprogramm verhält sich genauso. Ich habe versucht, es in OBJPROP_RAY für das Segment zu ändern, aber es funktioniert nicht. Können Sie den Grund dafür erklären? Ich danke Ihnen im Voraus.
Das Problem ist, dass MT4 nicht MT5 ist, und wenn der Code kompiliert wird, bedeutet das nicht, dass er auch funktioniert.
Tatsache ist, dass MT4 nicht MT5 ist, und wenn der Code kompiliert wird, bedeutet dies nicht, dass er funktioniert.
Ich verstehe. Und deshalb frage ich, ob die Einstellung " Fortsetzung des Objekts nach rechts" mittels OBJPROP_RAY_RIGHT wirklich im MT-4 für ( OBJ_FIBO ) funktioniert ? Ein Beispiel für ein Skript stammt aus einem Lehrbuch für mt-4.
Das verstehe ich. Deshalb frage ich, ob die Einstellung "Objekt nach rechts weiterführen" mit OBJPROP_RAY_RIGHT in mt-4 für (OBJ_FIBO) wirklich funktioniert? Das Beispielskriptstammt aus dem Tutorium für mt-4.
Es ist möglich, dass sie es bei der Bearbeitung der Hilfe übersehen haben. Dies wurde in der mql5-Dokumentation korrigiert.
Hallo zusammen. Es ist eine Woche her, dass ich angefangen habe, mich mit mql zu beschäftigen, und ich habe darüber nachgedacht, wie man einen solchen Mechanismus implementieren kann. Das Diagramm hat eine Schaltfläche (OBJ_BUTTON), wie und was sollte in den Code geschrieben werden, um eine Zahl aus einer bestimmten Sequenz in der Reihenfolge zu drucken, wenn Sie auf die Schaltfläche klicken. Das heißt, es gibt eine Folge von 2, 4, 8, 16, 32, 64, 128. Ich drücke z.B. die Taste auf dem Diagramm und die Zahl aus dieser Folge soll in einem Kommentar angezeigt werden, streng in der Reihenfolge. Ich habe die Taste gedrückt - es wird 2 angezeigt, ich habe sie erneut gedrückt - es wird 4 angezeigt und so weiter. Drückt man beispielsweise die zweite Taste, erscheinen diese Zahlen in umgekehrter Reihenfolge. Wenn Sie einen funktionierenden Code schreiben können, wird meine Freude vorbei sein)))
Lesen Sie die Dokumentation des Diagramms, um herauszufinden, welche Zahl in dem Kommentar steht. Dort gibt es eine Funktion zum Lesen des Kommentars.
Oder die einfachste, diese Zahl in eine statische Variable zu setzen, und es in Comment()
Lesen Sie die Dokumentation des Diagramms, um herauszufinden, welche Zahl in dem Kommentar steht. Dort gibt es eine Funktion zum Lesen des Kommentars.
Am einfachsten ist es, diese Zahl in eine statische Variable zu packen und in Comment() einzugeben
Vielen Dank für die Antwort. Ich habe in der Hilfe herausgefunden, wie man das Drücken von Tasten behandelt, aber ich habe Probleme mit dem Rest. Ich arbeite nicht nur mit einer Zahl, sondern mit einer Folge von ganzen Zahlen, und ich brauche einen Tastendruck, um eine Zahl aus dieser Folge auszugeben, in der Reihenfolge von 2 bis 128. Die Frage ist nur, wie man das genau macht...