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

 

Olá guru da programação

Você pode me dizer como desenhar um retângulo preenchido com a cor de fundo no canto superior esquerdo com uma pequena reentrância (para estética) no topo da carta e sob o texto exibido pelo especialista?

Obrigado de antemão

 
if(!trend)
      {

      (if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)     // Если бар соответствует требуемым признакам..
          cnt++;                                                                     // .. прибавим 1 к счётчику

      if (Close[i] < Open[i])                                                        // Если бар, не соответствует основному признаку..
          cnt = 0;   
      }
      else
      {
      ...
      }
 
Pessoal, onde vocês podem baixar uma biblioteca de notificações de som. ou seja, para tocar uma voz como "Buy position closed at takeprofit". para que possa ser tocada em PlaySound("Buy_close_tp.wav");
 
YOUNGA:

é a mesma coisa... Para descrevê-lo também, apenas para uma situação diferente.
 
Você pode dirigir ou dirigir de carro! Se você passar a variável de tendência como um valor numérico, você pode multiplicar a diferença por +1 ou -1, por exemplo (eu não faria isso)
 
CYBOPOB:

Não é isso?

Artem, não se importa de escrever o código, pois não? Ou me dê aquela coisa que tem na mão e eu acabo com esta miséria...

Não, viver um pouco mais... :) Vamos analisar seu código em particular, a fim de não desperdiçar o fórum.
 
tCynik:

Pergunta sobre o funcionamento do testador: Depois deexecutar um teste, você muda os parâmetros (datas, par de moedas, período de tempo), executa novamente o teste - ele é executado, mas quando está sobre as informações nas guias como "gráfico" e "relatório" não muda em nada - tudo permanece do teste anterior. O relatório salvo também se revela velho. Qual é a razão e como consertá-la? Talvez haja alguma função para redefinir os resultados?

Li o manual, artigos, procurei no fórum - não encontrei nenhuma menção a tal problema...


Não deveria ser assim, talvez você tenha a "Otimização" verificada?
 
Sepulca:

Este não deveria ser o caso, talvez você tenha selecionado "Otimizar"?


Oh, esse parece ser o caso: ao fazer um novo teste não percebi que a otimização estava em andamento, achei que não era crítica. Solução de interface levemente estranha...

Mas agora está funcionando, muito obrigado!

 
TarasBY:
Eu não me aprofundei na lógica, mas algo me diz que há alguns cálculos desnecessários. Há um ano e meio atrás eu estava resolvendo o mesmo problema com citações recolhendo e formando castiçais M1 com corte claro no início do minuto astronômico.
Se você estiver interessado, poderá dar uma olhada em alguns momentos de pura otimização de seu código (arquivo). Realmente, se falamos seriamente sobre otimização, você precisa medir o tempo de execução do código. ;)


Agora estou tentando de uma maneira totalmente diferente do zero.

Pergunta para Vadim sobre o mapeamento. Então, uh... Começou do zero. Pegamos o tiquetaque original TF:

int start()
  {  
//----
if(flag == true)
  {
  if(tick.time.local == true)
    {
    time = TimeLocal();
    }
    else{
    time = TimeCurrent();
    }
  if(t < time)
    { 
         t = time; 
    }
    else{ 
         t ++;
    }   

  if(FileSeek(hand1e, fpos, SEEK_SET) == false)
           { 
           error = GetLastError();
           Print("out: error(",error,"): ",ErrorDescription(error));
           flag = false;
           return;
           }
           else{
           bid = MarketInfo(symbol, MODE_BID);
           ask = MarketInfo(symbol, MODE_ASK);
           
                FileWriteInteger(hand1e,    t,   LONG_VALUE);            
                FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);          
                FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);            
                FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);    
                FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);                            
                FileWriteDouble (hand1e, time, DOUBLE_VALUE);                   
      FileFlush       (hand1e);  

      fpos = FileTell (hand1e);
      
      if(tick.chart.update == true)
        {
                  hwnd = WindowHandle(sn, 1);
        if(PostMessageA(hwnd, WM_COMMAND, 0x822c, 0) == false)
          {
          hwnd = 0;
          return;
          }
          PostMessageA(hwnd, MT4InternalMsg, 2, 1);             
          }                  
      } 
  }
//----
   return(0);
  }

Em princípio, há uma lógica muito simples: pegamos um bidask, formamos RateInfo, mas colocamos o tempo no Volume e modelamos o Tempo. Agora, sem nos preocuparmos em como simular o Tempo, removemos a simulação completamente e a fazemos por TOLHCV padrão e antes disso colocamos "se passaram mais de 0 segundos desde a última chamada de partida()". Se fosse menos em outro ramo da mesma condição, editar Volume Alto-Baixo e Aumentar. Em essência é o mesmo que o descrito acima, mas com o ciclo completamente removido, ou seja, obtemos a segunda TF "com lacunas" (com segundos faltando):

int start(){  
//----
        if(flag){
                bid = MarketInfo(symbol, MODE_BID);
                ask = MarketInfo(symbol, MODE_ASK);
                   
                if(FileSeek(hFile, fpos, SEEK_SET) == false){ 
                        error = GetLastError();
                        Print("out: error(",error,"): ",ErrorDescription(error));
                        flag = false;
                        return;
                }else{
                        if(time==TimeCurrent()){
                                if(bid<bid_prev){
                                        FileSeek(hFile, fpos-32, SEEK_SET);
                                        FileWriteDouble (hFile,  bid, DOUBLE_VALUE);
                                        FileFlush       (hFile);
                                }
                                if(bid<bid_prev){
                                        FileSeek(hFile, fpos-24, SEEK_SET);
                                        FileWriteDouble (hFile,  bid, DOUBLE_VALUE);
                                        FileFlush       (hFile);
                                }
                                vol++;
                                FileSeek(hFile, fpos-8, SEEK_SET);
                                FileWriteDouble (hFile,  vol, DOUBLE_VALUE);
                                FileFlush       (hFile);
                                bid_prev=bid; ask_prev=ask;
                        }else{
                                time=TimeCurrent();
                                vol=1;
                                if(bid<bid_prev){close=bid; open=ask;
                                }else{close=ask; open=bid;}
                                ask_prev=ask; bid_prev=bid;
                                
                                FileWriteInteger(hFile,  time,  LONG_VALUE);
                                FileWriteDouble (hFile,  open, DOUBLE_VALUE);
                                FileWriteDouble (hFile,  bid, DOUBLE_VALUE);
                                FileWriteDouble (hFile,  ask, DOUBLE_VALUE);
                                FileWriteDouble (hFile,  close, DOUBLE_VALUE);
                                FileWriteDouble (hFile,  vol, DOUBLE_VALUE);
                                FileFlush       (hFile);
                                fpos = FileTell (hFile);
                        }
                        if(tick.chart.update == true){
                                hwnd = WindowHandle(sn, 1);
                                if(PostMessageA(hwnd, WM_COMMAND, 0x822c, 0) == false){
                                        hwnd = 0;
                                        return;
                                }
                                PostMessageA(hwnd, MT4InternalMsg, 2, 1);             
                        }            
                } 
        }
   return(0);
}

Também deixou a classificação de boi completamente fora. Vale a pena apostar? Vamos verificar, colocar GetTickCount() com encolhimento para esta variante e para a inicial do proprietário, executá-las simultaneamente em um gráfico, olhar para o registro:

16:14:56 Сек.тф с проп. AUDUSD,M1: 0
16:14:56 Тик.тф AUDUSD,M1: 0
16:14:56 Сек.тф с проп. AUDUSD,M1: 0
16:14:56 Тик.тф AUDUSD,M1: 0
16:14:56 Сек.тф с проп. AUDUSD,M1: 0
16:14:57 Тик.тф AUDUSD,M1: 0
16:14:57 Сек.тф с проп. AUDUSD,M1: 0
16:14:58 Тик.тф AUDUSD,M1: 0
16:14:58 Сек.тф с проп. AUDUSD,M1: 0
16:14:58 Тик.тф AUDUSD,M1: 0
16:14:58 Сек.тф с проп. AUDUSD,M1: 0
16:14:58 Тик.тф AUDUSD,M1: 0
16:14:58 Сек.тф с проп. AUDUSD,M1: 0
16:15:00 Тик.тф AUDUSD,M1: 0
16:15:00 Сек.тф с проп. AUDUSD,M1: 0
16:15:00 Тик.тф AUDUSD,M1: 0
16:15:00 Сек.тф с проп. AUDUSD,M1: 0
16:15:04 Тик.тф AUDUSD,M1: 0
16:15:04 Сек.тф с проп. AUDUSD,M1: 0
16:15:04 Тик.тф AUDUSD,M1: 0
16:15:04 Сек.тф с проп. AUDUSD,M1: 0
16:15:05 Тик.тф AUDUSD,M1: 0
16:15:05 Сек.тф с проп. AUDUSD,M1: 0
16:15:05 Тик.тф AUDUSD,M1: 0
16:15:05 Сек.тф с проп. AUDUSD,M1: 0
16:15:05 Тик.тф AUDUSD,M1: 0
16:15:05 Сек.тф с проп. AUDUSD,M1: 0
16:15:06 Тик.тф AUDUSD,M1: 0
16:15:06 Сек.тф с проп. AUDUSD,M1: 0
16:15:07 Тик.тф AUDUSD,M1: 0
16:15:07 Сек.тф с проп. AUDUSD,M1: 0
16:15:08 Тик.тф AUDUSD,M1: 0
16:15:08 Сек.тф с проп. AUDUSD,M1: 0
16:15:08 Тик.тф AUDUSD,M1: 0
16:15:08 Сек.тф с проп. AUDUSD,M1: 0
16:15:09 Тик.тф AUDUSD,M1: 0
16:15:09 Сек.тф с проп. AUDUSD,M1: 0
16:15:09 Тик.тф AUDUSD,M1: 0
16:15:09 Сек.тф с проп. AUDUSD,M1: 0
16:15:09 Тик.тф AUDUSD,M1: 16
16:15:09 Сек.тф с проп. AUDUSD,M1: 0
16:15:10 Тик.тф AUDUSD,M1: 0
16:15:10 Сек.тф с проп. AUDUSD,M1: 16
16:15:11 Тик.тф AUDUSD,M1: 0
16:15:11 Сек.тф с проп. AUDUSD,M1: 0
16:15:11 Тик.тф AUDUSD,M1: 0
16:15:11 Сек.тф с проп. AUDUSD,M1: 0
16:15:12 Тик.тф AUDUSD,M1: 0
16:15:12 Сек.тф с проп. AUDUSD,M1: 15
 

como esperado. Tick - original, segundos com lacunas - modificado. Agora forma uma matriz auxiliar antes do tempo=TimeCurrent():

Δt=TimeCurrent()-time;
Σ=Σ+Δt;
ArrayResize(ind, Σ);
for(; i<Σ; i++) ind[i]=iBars(sn, 1);
GlobalVariableSet("final", i);
time=TimeCurrent();

Isto está no código dos segundos tf. Para a EA que estará pairando no próprio segundotf, os valores de TOLHCV x segundos atrás podem então ser obtidos como ind[GlobalVariableGet("final")]-ind[GlobalVariableGet("final")-x]+1, se de alguma forma esta matriz for passada. Portanto, vamos usar o mapeamento:

//в шапке
#import "SharedMemoryMT4.dll"
        int MemoryCreate(int nArea, string sPrefixArea, int hFileUser, int nIndex, string sName, int nSize);
        bool MemoryWriteInt(int nArea, string sPrefixArea, int nIndex, string sName, int nStartByte, int nValue);
        bool MemoryCloseHandle(int nArea, string sPrefixArea, int hMemory);
#import
//в инит
hMapping=MemoryCreate(1, "", NULL, -1, "ind", 60*GlobalVariableGet("ADXBars"));
//в деинит
MemoryCloseHandle(1, "", hMapping);
//в старт вместо 
for(; i<Σ; i++) MemoryWriteInt(1, "", -1, "ind", i, iBars(sn, 1));//ind[i]=iBars(sn, 1);

Escrevemos um roteiro de teste que vai pairar sobre os segundos e lemos os valores deTOLHCV x segundos atrás (não os candelabros):

#property show_inputs
#import "SharedMemoryMT4.dll"
   int MemoryOpen(int nArea, string sPrefixArea, int nIndex, string sName);
   int MemoryReadInt(int nArea, string sPrefixArea, int nIndex, string sName, int nStartByte);
#import
extern int x;//сколько секунд назад с данного момента прикрепления смотрим значения TOLHCV

int init()
  {
   MemoryOpen(1, "", -1, "ind");
   return(0);
  }
int start()
  {
   //MemoryReadInt(1, "", -1, "ind", i) это ind[i], GlobalVariableGet("final") это последний элемент в массиве, а ф-ла выглядит так: n=ind[final]-ind[final-x]+1
   int n=MemoryReadInt(1, "", -1, "ind", GlobalVariableGet("final"))-MemoryReadInt(1, "", -1, "ind", GlobalVariableGet("final")-x)+1;
   Alert(TimeToStr(TimeCurrent(),TIME_SECONDS), ": Time=", TimeToStr(Time[n], TIME_SECONDS), ", Open=", Open[n], ", High=", High[n], ", Low=", Low[n], ", Close=", Close[n], ", Volume=", Volume[n]);
   return(0);
  }

Executamos o cronograma de segundos. Na inicialização, será exibida uma janela

Ошибка в методе "Utils::Memory::Mapping::Create()".
В файловом отображении ""
не выделена память при отсутствии дескриптора пользовательского файла.

Há 58.572 vezes no tronco

10:45:42 SandyEw7-2.4 EURUSD,M1: function 'MemoryWriteInt' call from dll 'SharedMemoryMT4.dll' critical error c0000005 at 02CA05A3.
...
10:48:43 SandyEw7-2.4 EURUSD,M1: function 'MemoryWriteInt' call from dll 'SharedMemoryMT4.dll' critical error c0000005 at 02CA05A3.

e na desinicialização, mostra uma janela

В методе "MT4::Memory::SearchIndexOrHandle()" не установлен параметр для поиска в области памяти терминала.

Bem desinicializei-o mais tarde, eu coloquei o roteiro - alerta uma vez. Eu substituo MemoryCreate e MemoryCloseHandle, nada aparece (o script mantém o alerta), o log

10:54:55 PrintForSec sec_EURUSD,M1 inputs: x=8; 
10:54:56 PrintForSec sec_EURUSD,M1: initialized
10:54:56 PrintForSec sec_EURUSD,M1: Alert: 09:55:05: Time=00:00:00, Open=0, High=0, Low=0, Close=0, Volume=0

10:55:36 PrintForSec sec_EURUSD,M1 inputs: x=2; 
10:55:37 PrintForSec sec_EURUSD,M1: initialized
10:55:38 PrintForSec sec_EURUSD,M1: Alert: 09:55:46: Time=00:00:00, Open=0, High=0, Low=0, Close=0, Volume=0

- e é isso. Portanto, logicamente falando, estou usando chamadas em ordem errada ou declarando-as de forma incorreta. Meu sistema operacional é o WinXP. Vadim, ao menos me diga em que direção seguir.