[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 299

 
palomnik:

//-----------------------------------------------------------------------------+
//Quim Respeito e respeito!!! |
//+----------------------------------------------------------------------------+

Esta foi sem dúvida a parte mais estressante do código))))

Certo. Eu não entendo nada. Eu tenho o segundo TF em funcionamento. Tudo deveria estar funcionando como um relógio. Mas não. Não, está funcionando, mas não é o esperado. Verifiquei-o mil vezes. Eu mesmo não vejo nenhum erro sintático ou algorítmico. Deixe-me tentar explicar. Estou anexando o código completo. Portanto:

Δtime=TimeCurrent()-time;//перестраховка на случай, если TimeCurrent() во время выполнения цикла изменится
switch(Δtime){
  case 0 ://если секунда не прошла
    AccumulatorOfTicks(false);//заносим в массив-накопитель
    break;
  case 1 ://если прошла ОДНА секунда после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    AccumulatorOfTicks(true);//и ловим текущий тик
    break;
  default://если прошло НЕСКОЛЬКО секунд после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    Δtime--; time++;//уменьшаем разницу на единицу, т.к. свечу уже нарисовали
    while(Δtime!=0) WriteDash();//и рисуем прочерки по кол-ву пропущ. сек. минус один
    AccumulatorOfTicks(true);//ловим текущий тик
}

No início do início() coloquei um manipulador para o número de segundos decorridos desde o último início(). As seções repetidas foram movidas para funções definidas pelo usuário. O novo valor time=TimeCurrent() é atribuído ali, em funções do usuário.

void AccumulatorOfTicks(bool AtFirst){
        if (AtFirst){
                ArrayResize(bid, 1);//урезаем использованные массивы
                ArrayResize(ask, 1);
                i=0;//обнуляем счётчик тиков в секунду
                time=TimeCurrent();//приводим счётчик времени к текущему
        }else{
                ArrayResize(bid, i+1);
                ArrayResize(ask, i+1);
                i++;
        }
        bid[i]=MarketInfo(symbol, MODE_BID);
        ask[i]=MarketInfo(symbol, MODE_ASK);
        if (bid[i]==ask[i]) Alert("from accumulator: bid=ask");
}

A função funciona em dois modos: no primeiro ramo, AtFirst=verdadeiro, ele só pega um carrapato e pré-zeroes o array-storage, enquanto no segundo ramo, AtFirst=falso, ele funciona exatamente como um carrapato store. Ou seja, ou zeramos e truncamos a unidade e pegamos o bid-ask em uma célula zero, ou alongamos a unidade e pegamos o bid-ask. O alerta foi definido apenas para fins de depuração. Descreverei a condição de zeragem do acumulador mais adiante.

void WriteBar(){
        if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                //проверяем, переместилось-не переместилось, это я убрал, т.к. к вопросу не относится.
        }else{
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  ArraySize(ask), DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
                if(ArraySize(ask)==2) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - volume = ", ArraySize(ask)));
                if(bid[0]==ask[ArraySize(ask)-1]) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - bid=ask, Ticks = ", ArraySize(ask)));
                /*Необходимое пояснение. Хотя код рассчитан в т.ч. на тени свечей (т.е. независимыми от Open и Close
                 High и Low), в реальности их на чарте не будет, т.к. в секунде максимум 2 тика, три тика в секунде
                я ещё не встречал. Поэтому в массиве из двух элементов (т.е. двух тиков)
                один будет максимумом, другой минимумом, - и невольно совпадать с Open и Close.*/
        }
}

A função de "desenhar" a vela (adicionar uma vela ao .hst aberto na carta autônoma). Da mesma forma - coloco alertas para a depuração. O primeiro sinal de alerta em dois carrapatos capturados em um segundo (o tamanho da matriz é igual a dois, e na idéia o volume deve ser igual a dois), enquanto o segundo sinal em bit igual a umck no carrapato capturado (alerta semelhante no drive: mas funcionam de forma não-síncrona por alguma razão), e o volume do castiçal. Tudo isto, em teoria, de fato, quando inserido em arquivo (por alerta), por exemplo, dois (ou 0x00 00 00 00 00 00 00 40, duplo 2.0), de alguma forma ainda se revela ser um (0x00 00 00 00 00 00 00 F0 3F, duplo 1.0 no formato BigEndian). Eu normalmente anulo esse alerta na unidade, ele apita com freqüência, eu trabalho com esses dois.

void WriteDash(){
        if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                //аналогично убрал, т.к. к вопросу не относится.
        }else{//ставим прочерк на Close[0]
                Δtime--; time++;
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  0, DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
        }
}

A função "desenha" um traço no caso de não haver nenhum tique em que segundo. Ele funciona de acordo com o seguinte algoritmo:

Δtime=0: carrapatos de captura (cópia).

Δtime=1: Desenhe um castiçal no carrapato que foi pego antes, depois pegue o carrapato (com o acumulador preliminarmente zerado).

Δtime>1: Desenhe uma vela no carrapato apanhado antes, desenhe traços na linha Close[0] na quantidade deΔtime-1, apanhe um carrapato (com o acumulador preliminarmente zerado). Em todos os casos, o acumulador deve ser zerado quando uma vela já estiver acesa e isso significa que o acumulador não é mais necessário. Isto acontece quandoΔtime>0.

Vamos passar por ela:

A seta desenhou os momentos em que a oferta deveria ser igual a asc e o volume deveria ser igual a um. Eu não capturei o fundo com volumes, não se pode ver nada lá de qualquer maneira, é superficial. Mas todos eles são nivelados, ou seja, zero ou um, nenhum chega a dois (embora o alerta esteja sinalizando). Dois ticks por segundo - ainda quando você passa o mouse em cima ironicamente mostra volume = 1, e a oferta é igual a asku também mostra ironicamente volume = 0. Por quê? Entendo que em algum lugar é um erro, mas o mais provável é não notar o erro, ou olhar no lugar errado. Estou anexando o código, comentei bem a minha parte do código, verifiquei recuos em todos os lugares, removi inluders, apenas funções selecionadas para serem usadas, para que pudesse compilar mais rapidamente. A única observação - não funciona offline, ou seja, com o TimeLocal, ao contrário do coletor de carrapatos original, porque eu escrevi if(tickTimeLocal==verdadeiro) lá do zero (como eu não precisava muito). Tentei traduzi-lo em Expert Advisor seguindo o conselho de Taras - os castiçais não são mostrados em gráfico autônomo (mas a linha de citação atual está se movendo bem).

Arquivos anexados:
fif.ta.mq4  18 kb
 
artmedia70:

suas pantufas.

Você deve obter um spoiler da administração. Comecei a notar que calçados não comentados não se tornam menos calçados por alguma razão))
 

Olá

Aqui vai uma pergunta. Digamos que hoje é segunda-feira. Eu preciso saber o preço de fechamento na sexta-feira. Eu preciso saber o preço de fechamento na sexta-feira.

iClose(NULL, Period_D1, 1)
Fiz esta pergunta porque vejo os bares de sábado e domingo no Strategy Tester. Eu não tenho negociado nestes dias. Acima da linha escrita está o preço de fechamento na sexta-feira ou no domingo?
 
gince:

Olá

Aqui vai uma pergunta. Digamos que hoje é segunda-feira. Eu preciso saber o preço de fechamento na sexta-feira. Posso escrever

Eu recebi esta pergunta porque no Testador de Estratégia eu vejo bares no sábado e no domingo. Eu não negocio nesses dias. A linha escrita acima dá o preço de fechamento na sexta-feira ou no domingo?

Dê-me o preço de sexta-feira! Se o servidor fechar até as 24h00 de sexta-feira e não começar antes das 0h00 de domingo!

Use o indicador DailyPivotPoints!

 

Não, eu não entendo nada disso. Claramente já escrevendo

                switch(ArraySize(ask)){
                 case 0: FileWriteDouble(hand1e,  0.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 0")); break;
                 case 1: FileWriteDouble(hand1e,  1.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 1")); break;
                 case 2: FileWriteDouble(hand1e,  2.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 2")); break;
                 default: Alert("!!!!! - ", ArraySize(ask));
                }

Nos alertas iguais a 2, eu tiro o indicador dos minutos, arrasto o mouse sobre o castiçal. Volume=1.

Procurei o RateInfo em hst através do FileInsight (como debugger), acho que talvez haja int, mas não o dobro em Volume - não, mesmo-duplo...

 

Boa noite.

Obrigado por responder à minha pergunta))

Por favor, me diga se eu faço um pedido de compra como este OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0,0, "Buy",0,0,Green);

Se for uma ordem de vendaOrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0,0, "Sell",0,0,Red);


a diferença é azul ou é necessário mudar a cor vermelha também? ou seja, onde OP_BUY é o preço de licitação

onde OP_SELL tem o preço Ask

Eu também queria verificar se meu pedido não mudou e eu não queria mudá-lo, então por que está tudo bem no Testador de Estratégia, mas no REAL "Erro ao abrir o pedido 129" - AJUDA por favor.

 
ed3sss:

Boa noite.

Obrigado pela resposta à minha pergunta))

Por favor, me diga se eu faço um pedido de compra como este OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0,0, "Buy",0,0,Green);

Se for uma ordem de vendaOrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0,0, "Sell",0,0,Red);

a diferença é azul ou é necessário mudar a cor vermelha também? ou seja, onde OP_BUY é o preço de licitação

onde OP_SELL tem o preço Ask

Eu também queria verificar se meu pedido não mudou e eu não queria mudá-lo, então por que tudo correu bem no Testador de Estratégia e na Demonstração, mas eu recebi um erro de 129 quando tentei abri-lo no Mercado REAL?

Se você abrir Comprar, em Asc, se Vender em Bid! E feche ao contrário!
 
ed3sss:

Boa noite.

Obrigado por responder à minha pergunta))

Você pode me dizer se eu abro uma ordem de compra como esta OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0,0, "Buy",0,0,Green);

Se for uma ordem de vendaOrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0,0, "Sell",0,0,Red);

...
Na compra:
OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0,"Покупка",0,0,Green);

Vender:

OrderSend (Symbol(),OP_SELL,Lot,Bid,3,0,0,"Продажа",0,0,Red);

Recomendo a atualização das citações antes de enviar um pedido:

RefreshRates();
OrderSend (...);
E note que seu deslize =3, para citações de 4 dígitos será =3 pips e para citações de 5 dígitos será calculado como 0,3 pips. Portanto, se sua EA vai trabalhar com citações de 5 dígitos, então defina o escorregamento = 30.
 
gyfto:

Não, eu não entendo nada disso. Claramente já escrevendo

Nos alertas iguais a 2, eu tiro o indicador dos minutos, arrasto o mouse sobre o castiçal. Volume=1.

Procurei o RateInfo em hst através do FileInsight (como debugger), acho que talvez haja int, mas não o dobro em Volume - não, mesmo-duplo...

Veja o seu código.... Você tem tudo muito confuso))))

Não entendo bem porque precisamos acumular carrapatos, porque é suficiente armazenar em memória (ou mesmo não armazenar, porque a barra atual deve ser escrita em HST - caso contrário o gráfico não será atualizado) parâmetros da barra atual - seis números TOHLCV, e atualizá-los conforme necessário no recebimento do carrapato, e fazer o corte da barra na condição especificada(TimeCurrent()-O>1).

Tente reformular o código desta forma, ele será reduzido em 8 vezes, eu o garanto (eu o verifiquei:)

 
Tentei verificar um indicador, coloquei os números no gráfico mas eles não mudam, vou tentar colocá-lo de outra forma, preciso do indicador anexo para fixar o preço como uma cruz que fica em ziguezague ou alerta ou impressão, mas congela na conexão.
Arquivos anexados: