[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 335
borilunad: Então faça algumas escavações em seu próprio lugar! Você tem uma função para cada palavra de seu código, e você tem que se contentar com variáveis. Isso é o que torna o código pesado. Você deve usar funções quando não pode passar sem elas! Eu comentei tudo no código de Kim que eu não preciso, e tudo funciona muito rápido! Lembre-se, eu perguntei a todos como fazer o programa funcionar mais rápido sob muitas condições. Agora os testes funcionam por um ano em todos os carrapatos em 5 minutos! Passei a pente fino todas as condições e funções e joguei fora tudo o que era desnecessário.
É claro que eu me lembro. Vou continuar assim por um tempo. De fato, eu preciso mudar meus hábitos. Não é o primeiro programador a dizer que meu código não é fácil de entender. Aparentemente, é...
borilunad: Então cava em seu próprio lugar! Você tem uma função para cada palavra de seu código, e você tem que se contentar com variáveis. É por isso que seu código é pesado. Você deve usar funções quando não pode passar sem elas! Eu comentei tudo no código de Kim que eu não preciso, e tudo funciona muito rápido! Lembre-se, eu perguntei a todos como fazer o programa funcionar mais rápido sob muitas condições. Agora os testes funcionam por um ano em todos os carrapatos em 5 minutos! Passei a pente fino todas as condições e funções e joguei fora tudo o que era desnecessário.
As variáveis só podem ser dispensadas se testarmos a estratégia no testador.
Para o real, todo valor necessário para executar a lógica deve ser calculado no momento certo, pois os valores destas variáveis são muito fáceis de perder, por exemplo, durante um reinício.
Eu já descobri como escrever índices, mas tenho problemas com o primeiro robô. Parece lógico, o compilador não reclama, a revista não tem erros, mas o consultor especializado no testador não funciona - o gráfico se abre, mas não há movimento neste gráfico (o gráfico não se move).
A idéia é a seguinte: O indicador produz um ponto (sempre na abertura e no preço de abertura da vela) a partir do qual comprar ou vender, a tarefa do robô ao mesmo tempo, após receber um ponto para comprar ou vender, fechar a ordem oposta, abrir uma ordem nova ou modificar uma ordem antiga na mesma direção (as paradas e TP são emitidas por outro indicador)
Ficar-lhe-ia muito grato por dicas de onde está errado.
O código em si (mudou os nomes dos índices de acordo com sua funcionalidade, removeu a declaração das variáveis e a seção de tratamento de erros):
// Предварит.обработка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);
A essência do problema é a seguinte: não está claro o que colocar entre parênteses no corpo dos operadores nº 1,2, de fato, é verificada a conformidade das condições comerciais e não há mais ações.
(Há quatro sinais comerciais, disparadores número 1, passamos o controle para os sinais de processamento número 2, disparadores número 2, passamos para os sinais de processamento número 3 e 4 e realizamos operações comerciais lá).
elsereturn(0);
Vale a pena adicioná-lo ao final? Logicamente, se os sinais #3,4 não acionarem, então preciso que o Expert Advisor comece novamente.
As variáveis só podem ser usadas quando se testa a estratégia no testador.
Para o mundo real, todo valor necessário para executar a lógica deve ser calculado no momento certo, porque os valores destas variáveis são muito fáceis de perder, por exemplo, durante um reinício.
Mas será que as variáveis escritas no exterior se perdem? Isso nunca aconteceu! Mas todas as condições estão diante de meus olhos e em mãos no início(), e as funções, que estão fora do início(), têm verificações e ações finais não modificáveis! Posso estar errado, mas até agora estou confortável desta forma, e ainda não recebi um único erro ou rakeback no Real! Eu sempre leio cuidadosamente seus posts, Artem, e outros programadores experientes como alsu, Meat e outros, assim como moderadores convidados! Mas nem tudo ainda está dentro das minhas possibilidades, então não posso aplicar o que ainda não está claro para mim ao menor detalhe. obrigado por tudo!
Eu já descobri como escrever índices, mas tenho problemas com o primeiro robô. Parece lógico, o compilador não reclama, a revista não tem erros, mas o consultor especializado no testador não funciona - o gráfico se abre, mas não há movimento neste gráfico (o gráfico não se move).
A idéia é a seguinte: O indicador produz um ponto (sempre na abertura e no preço de abertura da vela) a partir do qual comprar ou vender, a tarefa do robô ao mesmo tempo, após receber um ponto para comprar ou vender, fechar a ordem oposta, abrir uma ordem nova ou modificar uma ordem antiga na mesma direção (as paradas e TP são emitidas por outro indicador)
Ficar-lhe-ia muito grato por dicas de onde está errado.
O código em si (mudou os nomes dos índices de acordo com sua funcionalidade, removeu a declaração das variáveis e a seção de tratamento de erros):
Se você tiver substituído os nomes dos indicadores apenas na EA, e não também nos próprios códigos indicadores, que são exibidos nas janelas correspondentes dos gráficos, então a EA não receberá nada deles, e o erro não é dado, porque tudo é apresentado na EA, mas não recebe sinais dos indicadores. Verifique se os nomes dos indicadores estão soletrados da mesma maneira!
borilunad: Se você mudou os nomes dos indicadores somente na EA, e não nos próprios códigos dos indicadores, que são exibidos nas janelas correspondentes dos gráficos, então a EA não receberá nada deles e não dará um erro, porque tudo é apresentado na EA, mas não recebe sinais dos indicadores. Verifique se os nomes dos indicadores estão soletrados da mesma maneira!
Obrigado pela dica, eu verifiquei tudo mais uma vez, não há erros na escrita. Apenas mudei os nomes dos indicadores no texto da primeira mensagem do fórum, a fim de tornar sua tarefa clara, no texto do Conselheiro Especialista os nomes dos índices são escritos exatamente como são nomeados na pasta "indicadores". Por exemplo: "3.0_figuri_2.3_rasshirenie".
Além disso, selecionei outra EA (do tutorial) e introduzi os nomes de indicadores inexistentes na função iCustom. O que aconteceu foi o seguinte - a EA realmente parou de negociar (o que é, aliás, compreensível), mas quando eu inicio o teste, o gráfico estava se movendo da data de início estabelecida para a data final estabelecida, devo lembrar que meu problema é que o gráfico não está se movendo.
Talvez alguém mais tenha enfrentado este problema?
Obrigado pela dica, eu verifiquei tudo mais uma vez, não há erros na escrita. Apenas mudei os nomes dos indicadores no texto da primeira mensagem do fórum, a fim de tornar sua tarefa clara, no texto do Conselheiro Especialista os nomes dos índices são escritos exatamente como são nomeados na pasta "indicadores". Por exemplo: "3.0_figuri_2.3_rasshirenie".
Além disso, selecionei outra EA (do tutorial) e introduzi os nomes de indicadores inexistentes na função iCustom. O que aconteceu foi o seguinte - a EA realmente parou de negociar (o que é, aliás, compreensível), mas quando eu inicio o testador, o gráfico estava se movendo da data de início estabelecida para a data final estabelecida, devo lembrar que o problema é que o gráfico não está se movendo.
Talvez alguém mais tenha tido esse problema.
Verifique o nome do indicador, não na pasta, mas em seu código: "nome curto", porque por ele o Expert Advisor o reconhece, se ainda estiver instalado no gráfico apropriado e no TF!
Obrigado pela dica, eu verifiquei tudo mais uma vez, não há erros na escrita. Apenas mudei os nomes dos indicadores no texto da primeira mensagem do fórum, a fim de tornar sua tarefa clara, no texto do Conselheiro Especialista os nomes dos índices são escritos exatamente como são nomeados na pasta "indicadores". Por exemplo: "3.0_figuri_2.3_rasshirenie".
Além disso, selecionei outra EA (do tutorial) e introduzi os nomes de indicadores inexistentes na função iCustom. O que aconteceu foi o seguinte - a EA realmente parou de negociar (o que é, aliás, compreensível), mas quando eu inicio o testador, o gráfico estava se movendo da data de início estabelecida para a data final estabelecida, devo lembrar que o problema é que o gráfico não está se movendo.
Talvez alguém mais tenha tido esse problema?
Fim de semana nos escritórios, para que o gráfico não se mova.
Então faça algumas escavações em seu próprio lugar! Você tem uma função para cada palavra de seu código, e você tem que se contentar com variáveis. Isso é o que torna o código pesado. Você deve usar funções quando não pode passar sem elas! Eu comentei tudo no código de Kim que eu não preciso, e tudo funciona muito rápido! Lembre-se, eu perguntei a todos como fazer o programa funcionar mais rápido sob muitas condições. Agora os testes funcionam por um ano em todos os carrapatos em 5 minutos! Passei a pente fino todas as condições e funções e joguei fora tudo o que era desnecessário.
É claro que eu me lembro. Vou continuar assim por um tempo. De fato, eu preciso mudar meus hábitos. Não é o primeiro programador a dizer que meu código não é fácil de entender. Aparentemente, é...
Então cava em seu próprio lugar! Você tem uma função para cada palavra de seu código, e você tem que se contentar com variáveis. É por isso que seu código é pesado. Você deve usar funções quando não pode passar sem elas! Eu comentei tudo no código de Kim que eu não preciso, e tudo funciona muito rápido! Lembre-se, eu perguntei a todos como fazer o programa funcionar mais rápido sob muitas condições. Agora os testes funcionam por um ano em todos os carrapatos em 5 minutos! Passei a pente fino todas as condições e funções e joguei fora tudo o que era desnecessário.
As variáveis só podem ser dispensadas se testarmos a estratégia no testador.
Para o real, todo valor necessário para executar a lógica deve ser calculado no momento certo, pois os valores destas variáveis são muito fáceis de perder, por exemplo, durante um reinício.
Bom dia a todos vocês.
Eu já descobri como escrever índices, mas tenho problemas com o primeiro robô. Parece lógico, o compilador não reclama, a revista não tem erros, mas o consultor especializado no testador não funciona - o gráfico se abre, mas não há movimento neste gráfico (o gráfico não se move).
A idéia é a seguinte: O indicador produz um ponto (sempre na abertura e no preço de abertura da vela) a partir do qual comprar ou vender, a tarefa do robô ao mesmo tempo, após receber um ponto para comprar ou vender, fechar a ordem oposta, abrir uma ordem nova ou modificar uma ordem antiga na mesma direção (as paradas e TP são emitidas por outro indicador)
Ficar-lhe-ia muito grato por dicas de onde está errado.
O código em si (mudou os nomes dos índices de acordo com sua funcionalidade, removeu a declaração das variáveis e a seção de tratamento de erros):
A essência do problema é a seguinte: não está claro o que colocar entre parênteses no corpo dos operadores nº 1,2, de fato, é verificada a conformidade das condições comerciais e não há mais ações.
(Há quatro sinais comerciais, disparadores número 1, passamos o controle para os sinais de processamento número 2, disparadores número 2, passamos para os sinais de processamento número 3 e 4 e realizamos operações comerciais lá).
Vale a pena adicioná-lo ao final? Logicamente, se os sinais #3,4 não acionarem, então preciso que o Expert Advisor comece novamente.
As variáveis só podem ser usadas quando se testa a estratégia no testador.
Para o mundo real, todo valor necessário para executar a lógica deve ser calculado no momento certo, porque os valores destas variáveis são muito fáceis de perder, por exemplo, durante um reinício.
Bom dia a todos vocês.
Eu já descobri como escrever índices, mas tenho problemas com o primeiro robô. Parece lógico, o compilador não reclama, a revista não tem erros, mas o consultor especializado no testador não funciona - o gráfico se abre, mas não há movimento neste gráfico (o gráfico não se move).
A idéia é a seguinte: O indicador produz um ponto (sempre na abertura e no preço de abertura da vela) a partir do qual comprar ou vender, a tarefa do robô ao mesmo tempo, após receber um ponto para comprar ou vender, fechar a ordem oposta, abrir uma ordem nova ou modificar uma ordem antiga na mesma direção (as paradas e TP são emitidas por outro indicador)
Ficar-lhe-ia muito grato por dicas de onde está errado.
O código em si (mudou os nomes dos índices de acordo com sua funcionalidade, removeu a declaração das variáveis e a seção de tratamento de erros):
Se você mudou os nomes dos indicadores somente na EA, e não nos próprios códigos dos indicadores, que são exibidos nas janelas correspondentes dos gráficos, então a EA não receberá nada deles e não dará um erro, porque tudo é apresentado na EA, mas não recebe sinais dos indicadores. Verifique se os nomes dos indicadores estão soletrados da mesma maneira!
Obrigado pela dica, eu verifiquei tudo mais uma vez, não há erros na escrita. Apenas mudei os nomes dos indicadores no texto da primeira mensagem do fórum, a fim de tornar sua tarefa clara, no texto do Conselheiro Especialista os nomes dos índices são escritos exatamente como são nomeados na pasta "indicadores". Por exemplo: "3.0_figuri_2.3_rasshirenie".
Além disso, selecionei outra EA (do tutorial) e introduzi os nomes de indicadores inexistentes na função iCustom. O que aconteceu foi o seguinte - a EA realmente parou de negociar (o que é, aliás, compreensível), mas quando eu inicio o teste, o gráfico estava se movendo da data de início estabelecida para a data final estabelecida, devo lembrar que meu problema é que o gráfico não está se movendo.
Talvez alguém mais tenha enfrentado este problema?
Obrigado pela dica, eu verifiquei tudo mais uma vez, não há erros na escrita. Apenas mudei os nomes dos indicadores no texto da primeira mensagem do fórum, a fim de tornar sua tarefa clara, no texto do Conselheiro Especialista os nomes dos índices são escritos exatamente como são nomeados na pasta "indicadores". Por exemplo: "3.0_figuri_2.3_rasshirenie".
Além disso, selecionei outra EA (do tutorial) e introduzi os nomes de indicadores inexistentes na função iCustom. O que aconteceu foi o seguinte - a EA realmente parou de negociar (o que é, aliás, compreensível), mas quando eu inicio o testador, o gráfico estava se movendo da data de início estabelecida para a data final estabelecida, devo lembrar que o problema é que o gráfico não está se movendo.
Talvez alguém mais tenha tido esse problema.
Obrigado pela dica, eu verifiquei tudo mais uma vez, não há erros na escrita. Apenas mudei os nomes dos indicadores no texto da primeira mensagem do fórum, a fim de tornar sua tarefa clara, no texto do Conselheiro Especialista os nomes dos índices são escritos exatamente como são nomeados na pasta "indicadores". Por exemplo: "3.0_figuri_2.3_rasshirenie".
Além disso, selecionei outra EA (do tutorial) e introduzi os nomes de indicadores inexistentes na função iCustom. O que aconteceu foi o seguinte - a EA realmente parou de negociar (o que é, aliás, compreensível), mas quando eu inicio o testador, o gráfico estava se movendo da data de início estabelecida para a data final estabelecida, devo lembrar que o problema é que o gráfico não está se movendo.
Talvez alguém mais tenha tido esse problema?