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

 
qwert2:
Eu escrevi o que acontece se você simplesmente mover o roteiro para uma pasta com especialistas. Funciona, mas não da maneira que deveria. O script cria 8 ordens pendentes, mas se apenas o salvarmos na pasta com os Expert Advisors, ele cria 8 ordens pendentes após cada tick. Preciso que ele faça 8 novas encomendas somente depois que as antigas forem fechadas.

Você escreveu apenas um "adiamento" em seu roteiro? Então só vai procrastinar: tantos carrapatos quantos forem necessários... oops... .........

Você tem que adicionar um terceiro inibidor de cheques.

 
qwert2:
Isto é o que acontece se o roteiro for simplesmente movido para a pasta dos especialistas. Funciona, mas não da maneira que deveria. O script cria 8 ordens pendentes, mas se você simplesmente salvá-lo na pasta Expert Advisors, ele cria 8 ordens pendentes após cada tick. Preciso que ele faça 8 novas encomendas somente depois que as antigas forem fechadas.
Isto não foi mencionado em sua pergunta. Não importa como transformar o roteiro em um Expert Advisor. Esta é outra implementação do programa.
 
Roger:

Eu encontrei um erro. Na biblioteca para esta função na linha

deve apagar zero em cada um dos números 13, 14 e 15.


Agora corretamente



Olá funções da biblioteca.
 
Roger:

Нашел ошибку. В библиотеке для данной функции в строке
надо удалить по нулю в 13, 14 и 15 числе.

Теперь правильно
tara:
Olá funções da biblioteca.
Não! Você não pode tocar nas funções da biblioteca padrão! Dima banido :-)))
 
artmedia70:

Você escreveu apenas um "adiamento" em seu roteiro? Então só vai procrastinar: tantos carrapatos quantos forem necessários... oops... .........

Você precisa colocar um verificador de proibição também lá.


))))) Não resiste)))))

Muito bem, vamos ao que interessa. Estou trabalhando na otimização do código da segunda TF, decidi traduzir duas vezes em int[2] para escrever a estrutura RateInfo em um bloco. Pensei sobre isso e decidi descrever todas as formas possíveis, inclusiveas não realizáveis, para que alguém pudesse ser avisado contra os erros.

1. WinAPI (msdn). De modo geral, não há muito aí em termos de funções de conversão. Isto porque a conversão faz uso extensivo da tradução do tipo c, que é algo como

char s1;
char s2="g";//код ANSI 0x67
int i1=1357;//0x54D в шестн. представлении
int i2;

s1=(char)i1;//0x4D, "M", старший разряд (5) был усечён по границе байта (две шестн. цифры), остался один байт (0x4D, десятичное 77)
i2=(int)s2;//0x00 0x00 0x00 0x67, десятичное 103

na linha seguinte à última linhaint i1 é convertido em char e na última linha char s2 é convertido em int. Como resultado, todo esse material é usado nas chamadas "funções de conversão" que, de fato, não estão em nenhuma dll WinAPI, mas declaradas em arquivos .h de cabeçalho usando macros como

#define _dtoi64(d)     (*((int64_t *)&(d)))
#define _dtoui64(d)     (*((uint64_t *)&(d)))

que em tempo de compilação o pré-processador se desenrola em string como no primeiro código. E os arquivos .h de cabeçalho não são dll e são usados somente em ambiente de desenvolvimento (Studio, Borland, gcc, etc). Portanto, não é bom nem ruim para a MQL4. Entretanto, você sempre pode verificar se a função é declarada apenas no arquivo .h do cabeçalho ou oculta dos olhos curiosos funções exportadas de algumas dll no Sistema32.

2) WinAPI (CRT dll). Estas dlls são denominadas msvcp*, msvcr*, msvcrt*, msvci*, msvcirt. Aqui a escolha é mais ampla: _atodbl, _atoi64, _atoldbl, _ftol, _i64toa, _itoa, _ltoa, _strtoi64, _strtoui64 _ui64toa, _ultoa, atof, atoi, atol, strtod, strtol, strtoul. Os símbolos no nome têm o seguinte significado:

a, str, w - string
f, l, i, ui, ul - int (4 байта)
d, dbl, i64 - double, int[2] (8 байт)
ldbl - int[2.5] (шучу) - 10 байт.

Mas o esperado _dtoi64/_dtoui64 ainda está faltando. Usando as definições msvcrt*, msvci*, msvcirt.dll, por outro lado

istream::operator>>(double &)
ostream::operator<<(double)

só está disponível, mesmo se você for torcido, como uma operação de arquivo (estas são operações de console).

Você pode pesquisar, além da msdn,neste site, aqui está a barra de pesquisa do site. Uma cadeia de busca "útil" semelhante está aqui. Como eles diferem? A msdn tem uma boa descrição das funções, mas algumas não estão presentes (NativeAPI, por exemplo). Na alternativa, por outro lado, qualquer tabela de exportação dll do sistema está lá, mas sem descrição. Basicamente, um conjunto de tabelas de exportação no site é mais fácil do que puxar tabelas de exportação da dll você mesmo (IDA, PE Explorer, etc.).

3. inserções de montadores (mais precisamente, inserções de código de máquina). Explicarei dentro de momentos, pois a documentação oficial é muito vaga a este respeito. As inserções C++ em MQL4

asm{//или _asm{
   //
   //какой-либо ассемблерный код
   //
}

asm/_asm não é uma função, mas uma diretiva de pré-processador, e não está definida em nenhum lugar no sistema32/*.dll (ver busca dentro do site). Em outras palavras, não existe tal coisa.

#import "/Windows/system32/superpuper.dll"
   asm(string& item[]);//в строковый массив заносим команы ассемблера
#import

Você pode escrever código de máquina puro em MQL4 mas somente em um caso: quando de acordo com a definição WinAPI-função em msdn deve passar um ponteiro para funcionar/proceder comolpTimerFunc (exemplo completo aqui no fórum), em msdn é declarado como:

UINT_PTR SetTimer(

    HWND hWnd,
    UINT_PTR nIDEvent,
    UINT uElapse,
    TIMERPROC lpTimerFunc//<-
);

oulpfnWndProc (exemploinacabado aqui no fórum, declaração msdn e tentativa de declaração de estrutura mql4). Não há outra maneira, MQL4 é um intérprete, o endereço da função não existe, não há nada para passar, somente se o código estiver escrito em código de máquina. Em seguida, eles são embalados em uma matriz int e passam para a função por referência.

Assim, as inserções de montagem compiladas (ou seja, código de máquina) não são aplicáveis a esta tarefa - elas têm um escopo completamente diferente. O máximo que se pode conseguir é executar um array int via debug em cmd via shell32.dll. Parece que a linha de comando não pode ser passada para lá, mas pode ser escrita usando as teclas virtuais via keybd_event.

4. Escrever minha própria função para converter o dobro em int[2] em MQL4 puro, sem inserções. Mas estimei o tamanho do código e seu desempenho, e desisti. Ainda nem sequer escrevi o módulo em si, mas acredito que o algoritmo é o seguinte:

1. Объявляем bool[64].
2. bool[0] равен 0, если плюс, и 1, если минус (отрицательное число то есть).
3. Находим значение выражения целая_часть(log_2(число))+1023. В цикле находим остатки от деления его на 2, заносим их в bool[11]-bool[1]
        в обратном порядке.
4. Разделяем целую и дробную чсти, сохраняем их в разные переменные.
5. Для целой части в цикле находим остаток от деления её на 2, пока не останется остаток от деления 1 или 0, заносим в этом же цикле значения
        в массив с bool[13+log_2(целая_часть)] до bool[12], в обратном порядке.
6. Для дробной части в цикле находим целую часть числа при циклическом умножении на 2. Целую часть запоминаем и отбрасываем, дробную умножаем дальше.
        Цикл до тех пор, пока при умножении в результате не получится 1. Заносим в прямом порядке, т.е. с начала (а начало на следующей ячейке после
        окончания пред. записи).
7. Теперь в цикле собираем в int[2] с конца bool[64], помня, что в int[0] идёт bool[0]-bool[31], а в int[1] идёт bool[32]-bool[63].
8. Ах, да, ещё BigEndian забыл.

A execução demoraria muito tempo. Assim, finalmente cheguei à solução mais óbvia e mais fácil

5. Uso de uma dll autoescrita em C++. O código é o seguinte:

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                                         )
{
    return TRUE;
}

__declspec(dllexport) void __stdcall dtoi(unsigned _int64 Dbl, int iDbl[2])
 {
        iDbl[0]=static_cast<unsigned int>(Dbl);
        iDbl[1]=static_cast<unsigned int>(Dbl>>32);
        return;
 }

No roteiro.

#property show_inputs //для вывода окна с настройкой параметров

#import "double.dll"//самонаписанная dll
   void dtoi(double Dbl, int& iDbl[]);
#import

extern double Dbl=96.578;//в параметрах передаём любую double-переменную
int iDbl[2];//и выходной double->int[2] массив
int handle;//хэндл тестового файла

int start(){
   handle=FileOpen("test.txt",FILE_BIN|FILE_WRITE);//открываем тестовый файл как бинарный "только на запись"
   FileWriteDouble(handle, Dbl);//записываем в тестовый файл double-переменную (8 байт)
   dtoi(Dbl, iDbl);//вызываем функцию конвертации; в iDbl помещается разпарсенный double
   FileWriteArray(handle, iDbl, 0, 2);//записываем в тестовый файл int[2]-переменную (8 байт)
   FileClose(handle);//сначала идут 8 байт double, затем 4+4=8 байт сконвертированных int
   return(0);//Получаем перезаписываемый \experts\files\test.txt в 16 байт.
  }

Int superior[0] é invertido porque o passamos por referência. Nós conseguimos:

...funcionou, as linhas no lixão são idênticas. A pasta anexa, nela está em bibliotecas, é double.dll, em samples - source dll, em scripts - script.

À noite: recarregou o arquivo e adulterou um pouco o script e o código dll.

Arquivos anexados:
ftdqcs.zip  57 kb
 

Eu não entendo o que fiz de errado. Por alguma razão a posição não está fechando como eu havia planejado?

Aqui está o critério para abrir uma posição

         if (Ask > iBands(NULL,0,M,2,0,N,MODE_LOWER,0)&& Low [1] < iBands(NULL,0,M,2,0,N,MODE_LOWER,1) && Hour()>=23 || Hour()<4)
         if (iStochastic(NULL,0,K,D,L,MODE_SMA,0,MODE_MAIN,0)> 20 && iStochastic(NULL,0,K,D,L,MODE_SMA,0,MODE_MAIN,1) < 20)
           {     
            Opn_B  =  true;     // Критерий открs. Buy
            OpenFunction ( Opn_B,  Opn_S, Lots);     //окрываем позицию
            
           }
         
         if (Bid < iBands(NULL,0,M,2,0,N,MODE_UPPER,0)&& High [1] > iBands(NULL,0,M,2,0,N,MODE_UPPER,1) && Hour()>=23 || Hour()<4)
         if (iStochastic(NULL,0,K,D,L,MODE_SMA,0,MODE_MAIN,0)> 80 && iStochastic(NULL,0,K,D,L,MODE_SMA,0,MODE_MAIN,1) < 80)
       
           {   
            Opn_S  =  true;     // Критерий откр. Sell
            OpenFunction ( Opn_B,  Opn_S,  Lots);     //окрываем позицию 
            
           }

Aqui está o critério para fechar uma posição

if (Bid >= iBands(NULL,0,M,2,0,N,MODE_UPPER,0))    
         {                                                                      
         Cls_B  =  true;     // ... получаем критерий для закрытия позиции Buy
         CloseFunction ();     //исполняем функцию закрытия ордеров
         return;
         }
       
       if (Ask <= iBands(NULL,0,M,2,0,N,MODE_LOWER,0))       
         {                                                                      
         Cls_S  =  true;
         CloseFunction ();     //исполняем функцию закрытия ордеров
         return;
         }

e aqui está o que conseguimos:

 
Zhunko:
Não! Você não pode tocar nas funções da biblioteca padrão! Dima banido :-)))


Por que você está fazendo um palhaço aqui? Se houver um erro, você precisa comunicá-lo ao Servicedesk, ou fazer sua própria cópia do arquivo.
 
GaNDarM:

Eu não entendo o que fiz de errado. Por alguma razão a posição não está fechando como eu havia planejado?

Aqui está o critério para abrir uma posição

Aqui está o critério para fechar uma posição

e aqui está o que conseguimos:


E com que freqüência é verificado o critério de fechamento? Por acaso, não por bar?
 
ilunga:

E com que freqüência é verificado o critério de fechamento? Por acaso não por grades?

Não entendo bem a essência da pergunta. Modelo de teste de preço de abertura (método rápido em barras formadas)
 
Necessidade de retirar dinheiro da WMZ para a QIWI. à procura de pessoas para cooperar. Pronto para receber cerca de 5% de comissão