//================================================================================== 4 ==
double AT[33]; // Массив для внешних переменных
bool New_Parametr = false; // Обновления параметров пока не было
for (int i=0; i<=32; i++) // Поищем обновлённый параметр
{ // Если какой-то параметр обновлён..
if(NormalizeDouble(AT[i], 8) != NormalizeDouble(Instrument[0][0][i][0],8))
{
New_Parametr = true; // .. запоминаем этот факт..
for (i=0; i<=32; i++) // .. то присвоим новые значения всем
AT[i] = Instrument[0][0][i][0]; // Для удобства пользования
break; // .. и выходим из цикла перебора
}
}
//================================================================================== 5 ==
int Strategy = NormalizeDouble(AT[0],0);
switch(Strategy)
{
女士们,先生们!
请回答一个问题。
你应该在代码中如何以及在哪里指定外部变量?
从上面的例子来看,这并不清楚。
//================================================================================== 4 == double AT[33]; // Массив для внешних переменных bool New_Parametr = false; // Обновления параметров пока не было for (int i=0; i<=32; i++) // Поищем обновлённый параметр { // Если какой-то параметр обновлён.. if(NormalizeDouble(AT[i], 8) != NormalizeDouble(Instrument[0][0][i][0],8)) { New_Parametr = true; // .. запоминаем этот факт.. for (i=0; i<=32; i++) // .. то присвоим новые значения всем AT[i] = Instrument[0][0][i][0]; // Для удобства пользования break; // .. и выходим из цикла перебора } } //================================================================================== 5 == int Strategy = NormalizeDouble(AT[0],0); switch(Strategy) {如何使应用程序的设置中的外部变量不被非人格化AT_1...AT_32,因为你不记得每个数字代表什么?
策略的外部变量值在专家顾问设置中被指定(以及任何外部变量的值)。
你不能在专家顾问中改变外部变量的名称,因为它们被写入专家顾问AG_exp.ex4的代码中。
专家顾问的外部变量名称通过仪器阵列传递给策略的附件文件。
战略中的局部变量的名称,对应于专家顾问中的外部变量,可以在战略中改变。
本例中就是这种情况。
如果你愿意,你可以指定你自己的名字。
例如,不指定AT[i],而是指定Alfa、Beta,等等。
阵列仪器[][][]:http://autograf.dp.ua/Pages/2/26/267/2676.htm
AG_AT()中的策略:http://autograf.dp.ua/Pages/2/26/267/26711/26711_1.htm
附带的策略:http://autograf.dp.ua/Pages/2/26/267/26711/26711_2.htm
编码策略的例子。
http://autograf.dp.ua/Pages/2/26/267/26712/26712_1.htm
иhttp://autograf.dp.ua/Pages/2/26/267/26712/26712_2.htm
现在我明白了。没有任何编程经验,我不能马上明白。谢谢你。
Если программно, то можно воспользоваться функцией ObjectDelete() или ObjectsDeleteAll().
那我应该把它放在我的战略中的什么地方?还是每次调用自定义函数时都会创建和删除这些对象?
现在我明白了。没有任何编程经验,我不能马上明白。谢谢你。
那我应该把它放在我的战略中的什么地方?还是每次调用用户函数时都会创建和删除对象?
它不需要在用户功能或战略中进行规定。
做一个简单的独立脚本。关掉策略后,把它扔到窗口,它会删除所有不必要的东西。
(在AG5中,我们将不得不在策略中进行某种脱嵌;但解决方案将取决于MQL5的可能性)。
谢谢你的合理建议。只有你高估了我。我还没有处理过脚本,但我会朝这个方向走。如果可能的话,请给我一个类似的链接。
到目前为止,我只熟悉了一下这个指标。
我以Vladislav Goshkov (VG)的TD_Points&Line_mgtd1.1.mq4作为模拟,加入log.mq4 Copyright © 2006, komposter用于创建报告,得到了我的指标的2000多行。
我做了它的计划。它有大约500行。我可能会把它切开,但现在还可以。
按图索骥
// --- // ---是切出的地方。
现在我心里有了结构,所以我想实现预期的功能。然后我们就按照规则梳理一切(质量的成本是几何级数 的递增)。
嗯,在SRC中没有521行。"文本大于允许的尺寸"。我们将不得不附上文件
在这个阶段,你需要熟悉特殊功能和应用类型。
最好的方法是拿着MQL4的教科书,从头开始一个一个地读。如果你有任何问题,请发表出来,我将尽力回答。
在这个阶段,你需要熟悉特殊功能和应用类型。
最好的方法是拿着MQL4的教科书,从头开始一个一个地读。如果你有任何问题,请发表出来,我将尽力回答。
你的手册是我的参考书。我下载并打印了它,一直在使用它。
如果我不理解我所读的内容,或者有些问题没有涉及,就会产生疑问。
有两个样本,分别是将数据写入外部文件或从新闻文件中读取,这是对Start()函数的一次调用。在Andrey Khatimlianskii(komposter)找到我所需要的例子之前 ,我已经忙活了一个多月了。即:init()--形成报告的表头(大约30列), start()--形成 带有会话每个交易参数的行,deinit()--形成会话的结果 。而我已经做了三种类型的报告(带有每个交易参数的表、带有会话总数的列和带有会话总数的表),我可以用不同的配置在Excel中进一步处理它们。顺便说一下,在 deinit()中 ObjectsDeleteAll()。但那是后来的事,但从一开始我就做了一堆图表 ,这样我就可以在测试器和现实生活中看到并分析一切。在编程时有很大帮助,因为MQL-4 没有调试器,这样就可以在图表上看到程序构建了哪些线(开盘和收盘条件、目标、交易线),以及它是如何做的。 但这都是在指标的范围内,它不进行实时交易。因此,有必要附加到专家顾问上,以实现非虚拟交易,加上使用测试器报告数据的能力,有可能自动优化。而这一切都不会失去到目前为止 在指标中实现的现有功能。
不幸的是,495页的教程,180页的 AutoGraf-4手册,370页 的MetaEditor, MT帮助 ,不可能把所有的东西都展示出来,而且生活中也没有足够的时间来阅读论坛 。但这只是为了好玩。
在 ,我做了一个策略函数的代码方案(基于指标算法),我不确定在哪里以及如何将ObjectsDeleteAll()的脚本放在那里 ,我插入交易函数(它们用 "zzzzzz "突出显示)是正确的吗?>> 请看一下这个东西。
策略功能代码图(基于指标算法)
//+------------------------------------------------------------------+ //| Shema_3_TD_BLS_21_1.mq4 | //| Copyright © 2009, Leonid Belskiy | //| leonid.belskiy@gmail.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, Leonid Belskiy" #property link "leonid.belskiy@gmail.com" //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж #property library //ж //ж #import "AG_Lib.ex4" //ж int AG_Magic_Number(); // Вычисление MN //ж int AG_Message(string & Message[], string _Text); // Запись сообщений в массив Message[] //ж // Запись управляющих воздействий ф-ии АТ в массив Manager[][]: //ж int AG_Set_Instr(double & Manager[][], int ii, double v1, double v2, double v3, //ж double v4, double v5, double v6, int io , int ih); //ж int AG_Delete_Instr(double&Manager[][], int ii, int io,int ih); //Удаление инструментов //ж #import //ж //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //ж int TD_BLS_21_2(int Parol_S, double Order[][], string Object[], //ж double Instrument[][][][], int Ddraw_Object[][], //ж double& Tuning[], double& Manager[][], string& Message[]) //ж { //ж static int Count = 0; // Счётчик посещений этого блока //ж //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //ж double Lot= NormalizeDouble(Tuning[1],2); // Значение лотов //ж int Per = NormalizeDouble(Tuning[2],0); // Значение % (целое) //ж int Slip = NormalizeDouble(Tuning[3],0); // Проскальзывание (пунктов) //ж int SL = NormalizeDouble(Tuning[4],0); // StopLoss (пунктов) //ж int TP = NormalizeDouble(Tuning[5],0); // TakeProfit (пунктов) //ж int Ds = NormalizeDouble(Tuning[6],0); // Дистанция (пунктов) //ж int St = NormalizeDouble(Tuning[7],0); // Шаг модификации (пунктов) //ж //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //ж if (Count==0) // Это можно делать один раз в начале //ж { // Пример сообщения (максимум 62 симв): //ж AG_Message(Message, "Разработчик J.Smith, http://company.com"); //ж Count++; // Количество посещений этого блока //ж //ж Lot = 0.1; // Если количество лотов Lot (Tuning[1]) больше нуля, .. //ж Per = 0; // .. независимо от значения переменной Per (Tuning[2]). //ж // Lot = 0.0; // 0.0 означает, что колич лотов высчитывается в AutoGraf //ж // Per = 7; // .. на основе значения % (здесь 7%) суммы баланса //ж Slip = 1; //ж SL = 25; //ж TP = 100; //ж // Ds = 20; //ж // St = 3; //ж Tuning[1] = Lot; // Значение лотов //ж Tuning[2] = Per; // Значение % (целое) //ж Tuning[3] = Slip; // Проскальзывание (пунктов) //ж Tuning[4] = SL; // StopLoss (пунктов) //ж Tuning[5] = TP; // TakeProfit (пунктов) //ж Tuning[6] = Ds; // Дистанция (пунктов) //ж Tuning[7] = St; // Шаг модификации (пунктов) //ж AG_Message(Message,"Изменение настроек из АТ."); // Пример сообщения (макс.62 симв.) //ж return(1); // Выход после перенастроек параметров //ж } //ж //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //ж int MN; // MagicNumber в ф-ии AG_Magic_Number() //ж string Comm = "AG_AT"; // Комментарий (рекомендуется "AG_AT") //ж static int Ticket; // Номер ордера //ж int _Ord_Ticket = 0; // Номер ордера //ж double _Ord_Lots = 0; // Полное закрытие //ж //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //ж double AT[33]; // Массив для внешних переменных //ж bool New_Parametr = false; // Обновления параметров пока не было //ж for (int i=0; i<=32; i++) // Поищем обновлённый параметр //ж { // Если какой-то параметр обновлён.. //ж AT[1]=11; //ж //ж if(NormalizeDouble(AT[i], 8) != NormalizeDouble(Instrument[0][0][i][0],8)) //ж { //ж New_Parametr = true; // .. запоминаем этот факт.. //ж for (i=0; i<=32; i++) // .. то присвоим новые значения всем //ж AT[i] = Instrument[0][0][i][0]; // Для удобства пользования //ж break; // .. и выходим из цикла перебора //ж } //ж } //ж //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж if((nTime!=Time[0])||(CurPeriod!=Period())) // На новом баре или изменении таймфрейма все пересчитываем { // Period Возвращает значение числа минут периода для текущего графика. //================================================= //******** Поиск опорных точек предложения ******** //================================================= for(i=2+StepBack,D=2,NP=0; (NP<D)&&(i<Bars); i++) // Перебираем бары влево начиная со 2-го бара от текущего { // Begin // --- // --- } // End; //================================================= //********** Поиск опорных точек спроса *********** //================================================= for(i=2+StepBack,D=2,NP=0; (NP<D)&&(i<Bars); i++) // Перебираем бары влево начиная со 2-го бара от текущего { // Begin // --- // --- } // End; //================================================= //**** Рисуем TD-линии **** //================================================= // --- // --- CurPeriod=Period(); // Соответствие минут графика с минутами системы nTime=Time[0]; // Соответствие время текущего и бара программы } //================================================= //**** Формирование сигналов для сделок **** //================================================= Fun_New_Bar(); // Определение нового бара //================================================= //**** Формирование сигналов на покупку **** //================================================= if((Close[i]>UpP[0]+UpV*(UpB[0]-i)+Puncture*Point) && (High[i+1]<=UpP[0]+UpV*(UpB[0]-(i+1)))) // Сигнал на покупку { // --- // --- Нахождение баров для расчета проекторов // --- // --- Расчет цен проекторов // --- // --- Расчет размеров проекторов if(NoQw ... ) // Определение квалификаторов прорыва { // --- // --- Формирование массива цен уровней целей // --- // --- Создаем и рисуем сигнал на покупку кружок (красный) if(Flag_Up==true) { // --- // --- Создаем и рисуем линию на покупку (красный) // --- // --- Создаем и рисуем линии целей //================================================ //**** Открываем сделку Buy **** //================================================ if(MiB_Up[1]==0 && Flag_Up_CD_Start==false && Flag_Up_Start==false && Flag_Dn_Start==false) { MiB_Up[1]=i; // Массив номеров баров точек Up сделки MiB_Up[1]-левая, MiB_Up[0]-правая MiP_Up[1]=Close[i]; // Массив цен точек Up сделки MiP_Up[1]-левая, MiP_Up[0]-правая MiBT_Up[1]=TimeCurrent(); // Количество секунд в момент открытия сделки Flag_Up_CD_Start=true; // Флаг рисования линий сделок на покупку - покупки запрещены Flag_Up_CD_End=false; // до закрытия сделки и образования нового бара Flag_Dn_Start=true; // Запрещено открывать противоположную Dn сделку // жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж AG_Message(Message, "АТ: сработал критерий открытия Buy."); // Сообщение(макс.62симв) ж MN = AG_Magic_Number(); // Вычисление MagicNumber (рекомендуется)ж OrderSend( Symbol(), OP_BUY, Lot, Ask, 2, Bid-SL*Point, Bid+TP*Point, Comm, MN); // Открытие ордера Buy: ж // жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж } bay++; // Счетчик нарисованных линий целей на покупку Flag_Up=false; // Линии нарисовали - флаг опустили до образования нового бара } } } //================================================= //**** Закрываем сделку Buy **** //================================================= if(Flag_Up_CD_Start==true && Flag_Up_CD_End==false) // Флаг конца рисования линий сделок на покупку - закрытие сделки { // Пока сделка открыта, пересчитываем точку [0] и перерисовываем линию // --- // --- // Расчет времени слелки (статистика отчета) // --- // --- // Расчет результата слелки (статистика отчета) // --- // --- // Рисуем линию сделки Up //-------жжжжжжжжжжжжжжжжжжжжжжжжж Выбор условий закрытия слелки Up if(CD_TrSL && Close[i]<iP_Up-TrStopLoss*Point) // (TrStopLoss==TrSL) Если цена пересекла TrStopLoss { // жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж if (NormalizeDouble(Order[1][6],0) == 0.0) // Если тип ордера Buy ж { ж _Ord_Ticket = NormalizeDouble(Order[1][4],0); // Номер ордера ж _Ord_Lots = NormalizeDouble(Order[1][5],2); // Полное закрытие ж OrderClose(_Ord_Ticket, _Ord_Lots, Bid, 2); // Закрыть ордер Buy ж } ж // жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж // --- // --- // Расчет времени по всем Up сделкам (статистика отчета) // --- // --- // Расчет времени по всем сделкам (статистика отчета) // --- // --- // Расчет баланса и результатов Up сделок (статистика отчета) // --- // --- // Формируем строку отчета (статистика отчета) } WindowRedraw(); } //================================================= //**** Формирование сигналов на продажу **** //================================================= if((Close[i]<DownP[0]+DownV*(DownB[0]-i)-Puncture*Point) && (Low[i+1]>=DownP[0]+DownV*(DownB[0]-(i+1)))) // Сигнал на продажу { // --- // --- Нахождение баров для расчета проекторов // --- // --- Расчет цен проекторов // --- // --- Расчет размеров проекторов if(NoQw ... ) // Определение квалификаторов прорыва { // --- // --- Формирование массива цен уровней целей // --- // --- Создаем и рисуем сигнал на продажу кружок (синий) if(Flag_Dn==true) { // --- // --- Создаем и рисуем линию на продажу (синий) // --- // --- Создаем и рисуем линии целей //================================================= //**** Открываем сделку Sell **** //================================================= if(MiB_Dn[1]==0 && Flag_Dn_CD_Start==false && Flag_Dn_Start==false && Flag_Up_Start==false) { MiB_Dn[1]=i; // Массив номеров баров точек Dn сделки iB_Up[1]-левая, iB_Dn[0]-правая MiP_Dn[1]=Close[i]; // Массив цен точек Dn сделки iP_Dn[1]-левая, iP_Dn[0]-правая MiBT_Dn[1]=TimeCurrent(); // Массив времени баров содержащих точки Dn сделки iBT_Dn[1]-левая, iBT_Dn[0]-правая Flag_Dn_CD_Start=true; // Флаг начала рисования линий сделок на продажу Flag_Dn_CD_End=false; // Флаг конца рисования линий сделок на продажу Flag_Up_Start=true; // Запрещено открывать противоположную Up сделку // жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж AG_Message(Message, "АТ: сработал критерий открытия Sell."); //Сообщение(макс62симв) ж MN = AG_Magic_Number(); // Вычисление MagicNumber (рекомендуется)ж OrderSend( Symbol(), OP_SELL, Lot, Bid, 2, Ask+SL*Point, Ask-TP*Point, Comm, MN); // Открытие ордера Sell: ж // жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж } sell++; // Счетчик нарисованных линий целей на продажу Flag_Dn=false; // Линии нарисовали - флаг опустили до образования нового бара } } } //================================================= //**** Закрываем сделку Sell **** //================================================= i=0; if(Flag_Dn_CD_Start==true && Flag_Dn_CD_End==false) // Флаг конца рисования линий сделок на продажу - закрытие сделки { // Пока сделка открыта, пересчитываем точку [0] и перерисовываем линию // --- // --- // Расчет времени слелки (статистика отчета) // --- // --- // Расчет результата слелки (статистика отчета) // --- // --- // Рисуем линию сделки Dn // --- // --- //-------жжжжжжжжжжжжжжжжжжжжжжжжж Выбор условий закрытия слелки Dn if(CD_TrSL && Close[i]>iP_Dn+TrStopLoss*Point) // (TrStopLoss==TrSL) Если цена пересекла TrStopLoss { // жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж if (NormalizeDouble(Order[1][6],0) == 1.0) // Если тип ордера Sell ж { ж _Ord_Ticket = NormalizeDouble(Order[1][4],0); // Номер ордера ж _Ord_Lots = NormalizeDouble(Order[1][5],2); // Будем закр.ордер полностью ж OrderClose(_Ord_Ticket, _Ord_Lots, Ask, 2); // Закрыть ордер Sell ж } ж // жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж // --- // --- // Расчет времени по всем Dn сделкам (статистика отчета) // --- // --- // Расчет времени по всем сделкам (статистика отчета) // --- // --- // Расчет баланса и результатов Dn сделок (статистика отчета) // --- // --- // Формируем строку отчета (статистика отчета) } WindowRedraw(); } } // жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж return(1); // Нормальный выход ж } ж // жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж void Fun_New_Bar() // Функция определения образования нового бара // --- // ---但确切地说,我做了一个策略函数代码方案(基于指标算法),我不知道在哪里以及如何插入 ObjectsDeleteAll()的脚本 ?我是否正确输入了交易功能(它们以 "zzzzzz "突出显示)?请看一下这个东西。
我认为你的想法很超前。
在编程中,你不能凭感觉操作。
你不能在自己的代码中使用程序员不太理解或根本不理解的东西。
这样一来,什么都做不成了。
编程,也许比其他任何活动都更需要在本质上完全清晰和完全自我报告。
从编写基本的代码开始。只有当你对代码中的每一个字母都有充分的解释时,才会进入更复杂的领域。
--
教科书上有一些简单的专家顾问的例子。
在前面的编程介绍中,有一个应用程序的分类(专家顾问、脚本和指标的标志和区别)。
脚本不能被 "插入 "专家顾问中。这是一个单独的独立方案。
一目了然,我可以说,你的代码格式很差。
此外,大部分区块可以被设计成函数。这样会更清楚(否则几个月后你就无法阅读自己的代码了)
你说得很对。我同意你的所有观点。谢谢你花时间提供建设性 的批评意见!
我所说的 "包括 "是指编写代码,将脚本操作与AG_AT()或其函数联系起来,从而实现策略。
在教程中,一个简单的专家顾问的例子包含start(),而在常规的例子中,所有的特殊功能都是存在的。 没有任何问题,但正如他们所说的那样,"胃口是随吃随有的"。
问题是如何使用AutoGraf-4的 所有伟大功能。我应该怎么做?