// Предварит.обработкаif(High[0]!=Low[0]) return; //если бар открылся до поступления текущей котировки, выход из start
vverh = iCustom(NULL,0,"Индикатор дающий точку на покупку",Glubina,Pogreshnost,0,0); //значение индикатора на покупку
vniz = iCustom(NULL,0,"Индикатор дающий точку на продажу",Glubina,Pogreshnost,1,0); //значение индикатора на продажуif(vverh==0 && vniz==0)
{
Alert("Сигнала нет. Эксперт ждёт сигнал.");
return;
}
if(Bars < Glubina) // Недостаточно баров
{
Alert("Недостаточно баров в окне. Эксперт не работает.");
return; // Выход из start()
}
if(Work==false) // Критическая ошибка
{
Alert("Критическая ошибка. Эксперт не работает.");
return; // Выход из start()
}
//--------------------------------------------------------------- 4 --// Учёт ордеров
Symb=Symbol(); // Название фин.инстр.
Total=0; // Количество ордеровfor(i=1; i<=OrdersTotal(); i++) // Цикл перебора ордеров
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:if (OrderSymbol()!=Symb)continue; // Не наш фин. инструмif (OrderMagicNumber()!=MagicNumber) // Попался ордер открытый не советникомcontinue;
Total++; // Счётчик ордеров открытых советникомif (Total>1) // Не более одного орд
{
Alert("Несколько ордеров одного советника. Эксперт не работает.");
return; // Выход из start()
}
Ticket=OrderTicket(); // Номер выбранн. орд.
Tip =OrderType(); // Тип выбранного орд.
Price =OrderOpenPrice(); // Цена выбранн. орд.
SL =OrderStopLoss(); // SL выбранного орд.
TP =OrderTakeProfit(); // TP выбранного орд.
Lot =OrderLots(); // Количество лотов
}
}
//--------------------------------------------------------------- 5 --// торговые критерииif(vverh>0)
{
Opn_B=true;
Cls_S=true;
Opn_S=false;
Cls_B=false;
}
if(vverh>0)
{
Opn_S=true;
Cls_B=true;
Opn_B=false;
Cls_S=false;
}
//--------------------------------------------------------------- 6 --//расчет стопов
i_stop=0;
while (stopov_for_S<2) //ищем 2 последних точки стопа в индикаторе, выбираем изз них самую дальнюю от текущей цены
{
for_S = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,0,i_stop);
if (for_S>0)
{
stopov_for_S++;
if(Stop_for_S<for_S) Stop_for_S=for_S;
}
i_stop++;
}
i_stop=0;
while (stopov_for_B<2)
{
for_B = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,1,i_stop);
if (for_B>0)
{
stopov_for_B++;
if(Stop_for_B<for_B) Stop_for_B=for_B;
}
i_stop++;
}
SL_for_B = Stop_for_B-pogreshnostSL;
SL_for_S = Stop_for_S+pogreshnostSL;
TP_for_B=vverh+(vverh-Stop_for_B)*koeff_dvizheniya;
TP_for_S=vniz-(Stop_for_S-vniz)*koeff_dvizheniya;
// Закрытие и модификация ордеровwhile(true) // Цикл закрытия и модификации орд.
{
if (Tip==0 && Opn_B==true) // Если открыт ордер БАЙ и индикатор дает сигнал на покупку
{
OrderModify(Ticket,SL_for_B,TP_for_B,0,CLR_NONE); //меняем стопы текущего ордера байbreak;
}
if (Tip==0 && Opn_S==true) // Если открыт ордер БАЙ и индикатор дает сигнал на продажу
{
RefreshRates();
Ans=OrderClose(Ticket,Lot,Bid,50); // закрываем БАЙif (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Buy ",Ticket);
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попытка
}
if (Tip==1 && Opn_S==true)
{
OrderModify(Ticket,SL_for_S,TP_for_S,0,CLR_NONE);
break;
}
if (Tip==1 && Opn_B==true)
{
RefreshRates();
Ans=OrderClose(Ticket,Lot,Ask,50);
if (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Sell ",Ticket);
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попытка
}
}
//--------------------------------------------------------------- 7 --// Стоимость ордеров
RefreshRates(); // Обновление данных
Min_Lot=MarketInfo(Symb,MODE_MINLOT); // Миним. колич. лотов
Free =AccountFreeMargin(); // Свободн средства
One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
Step =MarketInfo(Symb,MODE_LOTSTEP); // Шаг изменен размераif (Lots > 0) // Если заданы лоты,то
Lts =Lots; // с ними и работаем else// % свободных средств
Lts=MathFloor(Free*Prots/One_Lot/Step )*Step;// Для открытияif(Lts < Min_Lot) Lts=Min_Lot; // Не меньше минимальнif (Lts*One_Lot > Free) // Лот дороже свободн.
{
Alert(" Не хватает денег на ", Lts," лотов");
return; // Выход из start()
}
//--------------------------------------------------------------- 8 --// Открытие ордеровwhile(true) // Цикл закрытия орд.
{
Ticket=0;
if (Opn_B==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данныхAlert("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,50,SL_for_B,TP_for_B,"My order #",MagicNumber,0,CLR_NONE);//Открытие Buyif (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попыткаreturn; // Выход из start()
}
if (Opn_S==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данныхAlert("Попытка открыть Sell. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,50,SL_for_S,TP_for_S,"My order #",MagicNumber,0,CLR_NONE);//Открытие Sellif (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попыткаreturn; // Выход из start()
}
}
//--------------------------------------------------------------- 9 --return; // Выход из start()
}
If (торговые условия сигнал №1)
{
}// Какой код нужен, чтобы тело оператора №1 в случае соответствия, передало управление к оператору «торговых условий №2»
If (торговые условия сигнал №2)
{
}// Какой код нужен, чтобы тело оператора №2 в случае соответствия, передало управление к оператору «торговых условий №3 и №4»
If (торговые условия сигнал №3)
{
Opn_B=true;
}
else
If (торговые условия сигнал №4)
{
Opn_S=true;
}
elsereturn(0);
然后在你自己的地方做一些挖掘工作!你的代码的每一个字都有一个函数,你需要用变量来做。这就是使代码变得沉重的原因。当你不能不使用函数时,你应该使用它们!我在Kim的代码中评论了所有我不需要的东西,而且所有的工作都非常快!这就是为什么我们要使用函数。记住,我问大家如何使程序在许多条件下运行得更快。现在,在5分钟内对所有蜱虫进行了一年的测试!我梳理了所有的条件和功能,扔掉了所有不必要的东西。
我当然记得。我将保持一段时间。事实上,我需要改变我的习惯。这不是第一个说我的代码不容易理解的程序员。显然,它是...
所以在自己的地方挖吧!你的代码中的每一个字都有一个函数,而 你必须用变量来做。这就是为什么你的代码很重。 当你不能没有函数时,你应该使用它们!我在Kim的代码中注释了所有我不需要的东西,而且所有的工作都非常快记住,我问大家如何使程序在许多条件下运行得更快。现在,在5分钟内对所有蜱虫进行了一年的测试!我梳理了所有的条件和功能,扔掉了所有不必要的东西。
只有当我们在测试器中测试策略 时,才能省去变量。
对于真实,执行逻辑所需的每一个值都必须在正确的时间点上计算出来,因为这些变量的值非常容易丢失,例如在重新启动时。
祝大家今天愉快。
我已经想出了如何写索引,但我对第一个机器人有问题。这似乎是合乎逻辑的,编译器没有抱怨,日志也没有错误,但测试器中的专家顾问没有工作--图表打开了,但这个图形上没有任何移动(图表没有移动)。
该想法如下。该指标产生一个买入或卖出的点(总是在蜡烛的开盘和开盘价),同时机器人的任务是在收到买入或卖出的点后,关闭相反的订单,在同一方向开立新的或修改旧的订单(停止和TP由另一个指标发出)。
如果您能提示我哪里错了,我将非常感激。
代码本身(根据其功能改变了指数名称,删除了变量的声明 和错误处理部分)。
问题的实质如下。不清楚在操作者#1,2的正文中的大括号里应该写些什么,事实上,已经检查了交易条件的遵守情况,没有更多的行动。
(有四个交易信号,1号触发,我们把控制权传给2号处理信号,2号触发,我们把它传给3号和4号处理信号,在那里进行交易操作)。
是否值得把它加到最后?从逻辑上讲,如果信号#3,4没有触发,那么我需要专家顾问重新开始。
变量只能在测试器中测试策略时使用。
对于现实世界来说,执行逻辑所需的每一个值都必须在正确的时间计算出来,因为这些变量的值非常容易丢失,例如在重新启动时。
祝大家今天愉快。
我已经想出了如何写索引,但我对第一个机器人有问题。这似乎是合乎逻辑的,编译器没有抱怨,日志也没有错误,但测试器中的专家顾问没有工作--图表打开了,但这个图形上没有任何移动(图表没有移动)。
该想法如下。该指标产生一个买入或卖出的点(总是在蜡烛的开盘和开盘价),同时机器人的任务是在收到买入或卖出的点后,关闭相反的订单,在同一方向开立新的或修改旧的订单(停止和TP由另一个指标发出)。
如果您能提示我哪里错了,我将非常感激。
代码本身(根据其功能改变了指数名称,删除了变量的声明和错误处理部分)。
如果您只在EA中改变了指标的名称,而没有改变指标本身的代码,这些代码显示在图表的相应窗口中,那么EA将不会从它们那里接收到任何东西,也不会出现错误,因为一切都在EA中呈现,但它不会从指标中接收信号。检查指标名称的拼写是否相同!
谢谢你的提示,我再次检查了所有内容,没有写错。我只在论坛上的第一条信息的文本中改变了指标的名称,以使其任务明确,在专家顾问的文本中,指数的名称完全按照它们在 "指标 "文件夹中的名称来写。比如说。"3.0_figuri_2.3_rasshirenie".
此外,我选择了另一个EA(来自教程),并在iCustom函数中输入了不存在的指标名称。发生的情况如下--EA真的停止了交易(顺便说一下,这是可以理解的),但当我启动测试器时,图表从设定的开始日期移动到设定的结束日期,我应该提醒你,我的问题是,图表没有移动。
也许还有人遇到过这个问题?
谢谢你的提示,我再次检查了所有内容,没有写错。我只在论坛上的第一条信息的文本中改变了指标的名称,以使其任务明确,在专家顾问的文本中,指数的名称完全按照它们在 "指标 "文件夹中的名称来写。比如说。"3.0_figuri_2.3_rasshirenie".
此外,我选择了另一个EA(来自教程),并在iCustom函数中输入了不存在的指标名称。发生的情况如下--EA真的停止了交易(顺便说一下,这是可以理解的),但当我启动测试器时,图表从设定的开始日期移动到设定的结束日期,我应该提醒的是,问题是图表没有移动。
也许别人也有这样的问题。
谢谢你的提示,我再次检查了所有的东西,在写作上没有错误。我只在论坛上的第一条信息的文本中改变了指标的名称,以使其任务明确,在专家顾问的文本中,指数的名称完全按照它们在 "指标 "文件夹中的名称来写。比如说。"3.0_figuri_2.3_rasshirenie".
此外,我选择了另一个EA(来自教程),并在iCustom函数中输入了不存在的指标名称。发生的情况如下--EA真的停止了交易(顺便说一下,这是可以理解的),但是当我启动测试器时,图表从设定的开始日期移动到设定的结束日期,我应该提醒你,问题是图表没有移动。
也许有人遇到过这样的问题?