Pergunte! - página 157

 

Tente algo como isto :

string uniqueFileName()

{

string sname=TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);

string tname="";

for (int i=0;i<StringLen(sname);i++)

{

string char = StringSubstr(sname,i,1);

if (char!="." && char!=":")

if (char==" ")

tname = tname+"_";

else tname = tname+char;

}

return(tname+"_"+Symbol()+Period()+".csv");

}[/php]this one adds hour, minute and seconds in the middle to make it more or less unique (so something like this "20090924_102541_EURUSD15.csv"). To make it really sure that the file does not exist it would have to be a bit more complicated (something like this :

[php]string uniqueFileName()

{

string sname=TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);

string tname="";

int thand;

for (int i=0;i<StringLen(sname);i++)

{

string char = StringSubstr(sname,i,1);

if (char!="." && char!=":")

if (char==" ")

tname = tname+"_";

else tname = tname+char;

}

//

//

//

//

//

tname = tname+"_"+Symbol()+Period()+".csv";

thand = FileOpen(tname,FILE_BIN|FILE_READ);

if (thand==-1)

return(tname);

else

{

FileClose(thand);

return("failed to make unique name");

}

}

Ele retornará o fio"não conseguiu fazer um nome único" se falhar, neste caso você tem que decidir quantas vezes quer que ele tente novamente

PS: o uso seria algumFileName=uniqueFileName();

comentários

mladen

tedalagi:
Olá a todos,

Sou comerciante, mas não conheço a linguagem mq4 e estou tentando fazer isso desde terça-feira ...

Preciso salvar meu gráfico em formato csv usando um script. Tenho um bom script que posso simplesmente arrastá-lo em qualquer gráfico e em qualquer período de tempo e ele faz muito bem, exceto o nome do arquivo.

Desejo que ele possa gerar automaticamente um nome de arquivo único cada vez que eu salvar o gráfico para que eu não tenha que renomeá-lo cada vez que eu salvar outro arquivo na mesma pasta.

nome da string = [data no formato AAAAMMDD] + "_"+[data - hora apenas]+"_" + Símbolo() + Período() + ".csv";

O código em questão está em negrito.

Quando eu acertei o código, eu acho que o nome do arquivo de saída será parecido com o seguinte

20090924_10_GBPJPY15.csv

Lamento não poder gastar muito tempo para ler 157 páginas deste enorme fio (eu tinha tentado e minha cabeça ficou tonta)

Agradecemos antecipadamente.
 
 
 
mladen:
Use-o assim (o mql não permite funções ou procedimentos aninhados, portanto a função ou procedimento deve ser uma função ou procedimento separado)

Funciona perfeitamente, muito obrigado.

mladen:

De salvar arquivos em qualquer lugar : sim, pode ser feito usando o Windows API. Aqui está um link com um bom exemplo e uma boa explicação de como fazer isso : Operações de arquivos via WinAPI - MQL4 Artigos

Vou aprender sobre isso, e com certeza voltarei a este tópico mais tarde.

Que Deus o abençoe.

 

"Entrada Duplicada": Por que meu programa não funciona?

Desculpe: Eu postei isso antes, mas não posso recolocar o post no Fórum.

(Também não permite "bookmarks" do histórico do meu computador...)

De qualquer forma: escrevi um programa simples, que testa se duas barras consecutivas estão "para cima" ou "para baixo".

Ie: em "para cima", o alto na barra 1 é mais alto que na barra 2, e o baixo na barra 1

também é maior do que na barra 2. (A descida é simétrica).

O prog funciona c/ rupturas, assim em "para cima", o alto de bar1 menos o baixo

de bar2 deve estar acima de algum limite. ("Abaixo" é simétrico).

Agora trabalhando c/ M30 GBPUSD. Escolhido este "limiar de fuga" por olho,

como fez para o TakeProfit. StopLoss é como indicado no programa.

Assim: tentando ganhar experiência com MetaTrader & mql4.

Então, pode tentar outros progs, otimizar as coisas, etc.

Assim: chegar ao ponto de ter o programa compilado, e executado no Testador de Estratégia.

Mas, nunca chega à segunda metade do programa, ou imprimir que ele

entrou em uma ordem.

Para alguém que tenha experimentado, qualquer erro que eu tenha é provavelmente óbvio.

Não é evidente para mim mesmo.

Então: você poderia ajudar com isto?

Obrigado.

Prog segue.

//+------------------------------------------------------------------+

//| função de iniciação de especialista |

//+------------------------------------------------------------------+

int init()

{

//----

//----

retorno(0);

}

//+------------------------------------------------------------------+

//| função de desinicialização especializada |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

retorno(0);

}

//+------------------------------------------------------------------+

//| função de início especializado |

//+------------------------------------------------------------------+

int start()

{

//----

bool TrendUp1; duplo TakeProfitUp; duplo EE = .00500;

bool OrdTot_OK; duplo lote; duplo deslizamento;

duplo SL_Trailing_Up;bool High2Up;bool Low2Up;

int ticketup;int ticketdown;bool DownAndBig; bool UpAndBig;

bool TrendDown; double SL_Trailing_Down; double TakeProfitDown;

bool High2down; bool Low2down;

int ABC = OrdersTotal();

double Size1 = .00630;bool BigUp; double A = High[1];double B= Low[2];

duplo C= Alto[2]; duplo D= Baixo[1]; bool BigDown;

//------------------------------------down order start

se (ABC == 0)// nenhuma ordem fora é verdadeira

OrdTot_OK = verdadeiro;

se (ABC == 0)// nenhuma ordem fora é verdadeira

Imprimir ("na seqüência de ordem para baixo, nenhuma ordem saiu");

se ((C-D) > Tamanho1)//alto de 2 menos baixo de 1 > .0063

BigDown = verdadeiro;

se ((C-D) > Tamanho1)//alto de 2 menos baixo de 1 > .0063

Imprimir ("na seqüência de ordem para baixo, encontrei uma grande quebra");

se (Alto[1]< Alto[2])

High2down=verdadeiro;

se (Alto[1]< Alto[2])

Imprimir ("na seqüência de ordem decrescente, as barras consecutivas têm máximas decrescentes");

if(Baixo[1]< Baixo[2])

Low2down=verdadeiro;

if(Baixo[1]< Baixo[2])

Imprimir ("na seqüência de ordem decrescente, as barras consecutivas têm mínimos decrescentes");

se (High2down && Low2down)

TrendDown=verdadeiro;

if (High2down && Low2down)

Imprimir ("na seqüência de ordem para baixo, a bandeira TrendDown está definida");

se (TrendDown)

SL_Trailing_Down = Alto[1];

se (TrendDown)

Imprimir ("na seqüência de ordem para baixo, definiu o stop_loss");

se (TrendDown)

TakeProfitDown = Bid - (.005);

se (TrendDown)

Imprimir ("em seqüência de ordem decrescente, tem um takeprofit", TakeProfitDown);

se (TrendDown && BigDown)

DownAndBig = verdadeiro;

se (DownAndBig && OrdTot_OK)

ticketdown= OrderSend(Symbol(),OP_SELL,lot, Bid,slip,SL_Trailing_Down,TakeProfitDown,Blue);

if (DownAndBig && OrdTot_OK)

Imprimir ("na seqüência de ordem para baixo, tentou digitar um ticket", ticketdown);

se (ticketdown < 0)

Print("OrderSend_Down failed with error #",GetLastError()));

return(0);

//----------------------------------------------down order done

//---------------------------------------------------up order start

se (ABC == 0)

OrdTot_OK = verdadeiro;

se (ABC == 0)

Imprimir ("na seqüência de subida, nenhuma ordem estava fora");

se ((A - B) > Tamanho1)

BigUp = verdadeiro;

se ((A - B) > Tamanho1)

Imprimir ("na seqüência de subida, o teste de tamanho para as duas barras estava ok");

se (Alto[1] > Alto[2])

High2Up = verdadeiro;//44

se (Alto[1] > Alto[2])

Imprimir ("na seqüência de subida, o teste para aumentar as alturas foi ok");

if(Baixo[1] > Baixo[2])

Low2Up=verdadeiro;

if(Baixo[1] > Baixo[2])

Imprimir ("na seqüência de subida, o teste para aumentar as baixas foi ok");

se (High2Up && Low2Up)

TrendUp1=verdadeiro;

se (High2Up && Low2Up)

Imprimir ("na seqüência de subida, colocou a bandeira para subir");

se (TrendUp1)

SL_Trailing_Up = Baixa[1] ;

se (TrendUp1)

Imprimir ("na seqüência de subida, estabelece-se o stoploss");

se (TrendUp1)

TakeProfitUp = Pergunte + (.005);

se (TrendUp1)

Imprimir ("na seqüência de subida, estabelecer o takeprofit", TakeProfitUp);

se (TrendUp1 && BigUp)

UpAndBig = verdadeiro;

se ( UpAndBig && OrdTot_OK)

ticketup = OrderSend(Symbol(), OP_BUY,lot, Ask,slip, SL_Trailing_Up,TakeProfitUp,Red);

if (UpAndBig && OrdTot_OK)

Imprimir ("na seqüência de subida, tentou enviar um pedido", ticketup);

se (ticketup < 0)

Print("OrderSend_Up failed with error #",GetLastError()));

return(0);

//-------------------------------------------------up order done

//----

return(0);// esta linha pode ser supérflua

//+------------------------------------------------------------------+

//----

retorno(0);

}

//+------------------------------------------------------------------+

 

Usando múltiplos CharToStr????

Eu gostaria de colocar dois caracteres de vento. Um em cima do outro. Este é o código que estou usando para definir o primeiro caractere-----ObjectSetText("sinal "+x+"0",CharToStr(104),symbolSize, "Wingdings",Yellow);.

Gostaria de acrescentar (236) e usar uma cor diferente para ele.

É possível fazer? Se for, por favor, ajude.

Obrigado por procurar,

gever17

 

Sleep | IsTradeContextBusy

Saudação aos CodeMasters e todo o resto!

Tenho um EA baseado em Fractals, é usado em 1 plataforma MT4, e em múltiplos pares de moedas, no tempo D1.

Uma vez que mais de uma cópia do EA é comercializada no mesmo momento, recebo a notificação "Trade Context Is Busy" em meu Diário.

Gostaria de inserir a função Sleep ou IsTradeContextBusy em minha EA, mas não sei onde colocá-la:

- após a função Enviar pedido, separadamente para a função Vender e Comprar?

- após a função de Enviar pedido de Venda e Compra?

- como resolver este problema - com

se (IsTradeContextBusy() == verdadeiro) Dormir (5000); retornar;

???

Por favor, me aconselhe ou me indique uma solução.

Muito obrigado por sua ajuda,

Divirta-se,

Simon

EA anexado.

Arquivos anexados:
 

Aconselhamento necessário !

Olá,

Eu realmente apreciaria a ajuda de um programador com um problema pelo qual estou perdendo dinheiro. É que eu tenho uma EA que deveria abrir posições a um certo nível de preço, mas às vezes a serra de chicote faz com que ela abra muitas posições. Eu gostaria que ele abrisse apenas uma. Alguém pode me dizer se isso pode ser corrigido com uma linha de código ou se eu preciso contratar um programador?

Obrigado.

 

Pls adv

Oi pessoal, eu realmente não sei como MagicNumber funciona, bcos parece que DOESNT WORK???? Eu fiz 2 simples EA anexados, ainda estou aprendendo.

1. Compre quando o preço for acima de 100SMA

2. Vender quando o preço também for superior a 100SMA

significa que quando você os anexa a 2 diferentes gráficos Eurusd, deve um Comprar e outro Vender ao mesmo tempo. Como teoria, cada EA trabalha de forma independente.

Mas não funciona... Parece que quando Vender executado em 1º lugar, a EA Compra não vai funcionar, e vice-versa.

Qualquer um pode recodificar minha EA, o MagicNumber controlador? Algum erro?

Muito obrigado.

Arquivos anexados:
buy100ma.mq4  9 kb
sell100ma.mq4  9 kb
 
Ghosthand:
Oi pessoal, eu realmente não sei como o MagicNumber funciona, bcos parece que o DOESNT WORK???? Eu fiz 2 simples EA anexados, ainda estou aprendendo.

1. Comprar quando o preço for superior a 100SMA

2. Vender quando o preço também for superior a 100SMA

significa que quando você os anexa a 2 diferentes gráficos Eurusd, deve um Comprar e outro Vender ao mesmo tempo. Como teoria, cada EA trabalha de forma independente.

Mas não funciona... Parece que quando Vender executado em 1º lugar, a EA Compra não vai funcionar, e vice-versa.

Qualquer um pode recodificar minha EA, o MagicNumber controlador? Algum erro?

Muito obrigado

Parece que você colocou o número mágico corretamente. O único problema é que você não está verificando se o pedido com o mesmo número mágico existe no pool comercial atual. Você deve caminhar por todas as ordens abertas e verificar se OrderMagicNumber() == Seu número mágico antes de entrar em uma nova negociação.