Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 146

 

Geralmente envio os pedidos por funções separadas. Gostaria de otimizar isto, para que eu possa enviar ordens pendentes e de mercado com uma função.

Por favor, informe como implementá-lo corretamente?

Ao enviar pedidos pendentes, devemos verificar o preço de abertura acima (abaixo) do preço de licitação e levar em consideração alguns outros aspectos.

Vamos ver como os outros o fazem. Vamos pegar a variante mais simples utilizada por Kim:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2008                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
  color    clOpen;
  datetime ot;
  double   pp, pa, pb;
  int      dg, err, it, ticket=0;
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("OpenPosition(): Остановка работы функции");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    dg=MarketInfo(sy, MODE_DIGITS);
    pa=MarketInfo(sy, MODE_ASK);
    pb=MarketInfo(sy, MODE_BID);
    if (op==OP_BUY) pp=pa; else pp=pb;
    pp=NormalizeDouble(pp, dg);
    ot=TimeCurrent();
    ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if (pa==0 && pb==0) Message("Проверьте в Обзоре рынка наличие символа "+sy);
      // Вывод сообщения об ошибке
      Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
            " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
      // Блокировка работы советника
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Длительная пауза
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
      }
      if (err==140 || err==148 || err==4110 || err==4111) break;
      if (err==141) Sleep(1000*100);
      if (err==145) Sleep(1000*17);
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      if (err!=135) Sleep(1000*7.7);
    }
  }
  return(ticket);
}

Ele não verifica absolutamente nada. Podemos ver que sua função se destina apenas à abertura de ordens de mercado.

Eu não acho que isto seja lógico. Se você enviar um pedido, ele será de qualquer tipo. Se você escrever da maneira que eu penso, será muito longo, à primeira vista.

Em geral, estou pedindo ajuda e dicas sobre como implementar melhor estes pontos.

 
hoz:

Geralmente envio os pedidos por funções separadas. Gostaria de otimizar isto, para que eu possa enviar ordens pendentes e de mercado com uma única função.

Por favor, informe como implementá-lo corretamente?

Ao enviar pedidos pendentes, devemos verificar o preço de abertura acima (abaixo) do preço de licitação e levar em consideração alguns outros aspectos.

Vamos ver como os outros o fazem. Vamos pegar a variante mais simples utilizada por Kim:

Ele não verifica absolutamente nada. Podemos ver que sua função se destina apenas à abertura de ordens de mercado.

Eu não acho que isto seja lógico. Se você enviar um pedido, ele será de qualquer tipo. Se você escrever da maneira que eu penso, será muito longo, à primeira vista.

Em geral, deixe-me pedir ajuda e dicas sobre como implementar melhor estes pontos.

Bem, a função de Igor executa a própria tarefa indicada no nome da função. Todos os ajustes e verificações precisam ser feitos ANTES de chamar esta função. Afinal, a função em si faz apenas a tarefa a ela atribuída - abre a posição com os parâmetros passados a ela (para a função) e nada mais. Ele o faz perfeitamente bem com todo o manuseio de erros necessário. O que está faltando - desenvolva você mesmo.

Por analogia: quando você compra café instantâneo em uma loja, a água fervente e o açúcar e a mistura automática de outros ingredientes não são oferecidos a ele - é melhor você saber fazer seu próprio café.

 

Pessoal, é possível... Por favor, reescreva sob uma condição de loop diferente.

Ou seja, há um maravilhoso indicador bbands_stop:


for (shift=Nbars-Length-1;shift>=0;shift--)

{

smax[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_UPPER,shift);

smin[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_LOWER,shift);

if (Close[shift]>smax[shift+1]) trend=1;

if (Close[shift]<smin[shift+1]) trend=-1;


bsmax[shift]=smax[shift]+0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);

bsmin[shift]=smin[shift]-0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);

if (trend>0)

UpTrendBuffer[shift]=bsmin[shift];

else

DownTrendBuffer[shift]=bsmax[shift];

}

É possível escrever um código semelhante aos resultados do anterior? Mas por um loop:

for(i = 0; i <= limit; i++) {

Pelo segundo dia que estou aqui sentado; não consigo encontrá-lo...

 
Olá a todos, é claro que a pergunta é estúpida, quanto é o tamanho do lote necessário para fazer 1 pip no valor de 1 dólar?
 
0.1
 
FEAR:
Olá a todos, é claro que a pergunta é estúpida, quanto é o tamanho do lote necessário para fazer 1 pip no valor de 1 dólar?
Depende do tamanho do lote.
 
nikelodeon:
0.1
nem sempre
 
PapaYozh:
nem sempre
Dependendo do ombro....
 
0,1 a 1:100 alavancagem
 
nikelodeon:
Dependendo do ombro....

nikelodeon:
0,1 com uma alavancagem de 1:100

Os ombros são irrelevantes quando se trata de estilo de item.