Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 146

 

Suelo enviar los pedidos por funciones separadas. Me gustaría optimizar esto, para poder enviar tanto órdenes pendientes como de mercado con una sola función.

Por favor, aconséjeme cómo implementarlo correctamente.

Cuando se envían órdenes pendientes, debemos comprobar el precio de apertura por encima (por debajo) del precio de oferta y tener en cuenta algunos otros aspectos.

Veamos cómo lo hacen los demás. Tomemos la variante más sencilla 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);
}

No comprueba nada en absoluto. Podemos ver que su función está destinada únicamente a la apertura de órdenes de mercado.

No creo que esto sea lógico. Si envía un pedido, será de cualquier tipo. Si lo escribes como yo pienso, será demasiado largo, a primera vista.

En general, pido ayuda y pistas sobre cómo aplicar mejor estos puntos.

 
hoz:

Suelo enviar los pedidos por funciones separadas. Me gustaría optimizar esto, para poder enviar tanto órdenes pendientes como de mercado con una sola función.

Por favor, aconséjeme cómo implementarlo correctamente.

Cuando se envían órdenes pendientes, debemos comprobar el precio de apertura por encima (por debajo) del precio de oferta y tener en cuenta algunos otros aspectos.

Veamos cómo lo hacen los demás. Tomemos la variante más sencilla utilizada por Kim:

No comprueba nada en absoluto. Podemos ver que su función está destinada únicamente a la apertura de órdenes de mercado.

No creo que esto sea lógico. Si envía un pedido, será de cualquier tipo. Si lo escribes como yo pienso, será demasiado largo, a primera vista.

En general, permítanme que les pida ayuda y consejos sobre cómo aplicar mejor estos puntos.

Pues bien, la función de Igor realiza la misma tarea indicada en el nombre de la función. Todos los ajustes y comprobaciones deben realizarse ANTES de llamar a esta función. Al fin y al cabo, la función en sí sólo realiza la tarea que se le asigna: abre la posición con los parámetros que se le pasan (a la función) y nada más. Lo hace perfectamente bien con todo el manejo de errores necesario. Lo que falta - desarrollarlo usted mismo.

Por analogía: cuando se compra café instantáneo en una tienda, no se le ofrece el agua hirviendo y el azúcar ni la mezcla automática de otros ingredientes; más vale que sepa preparar su propio café.

 

Amigos, ¿es posible... Por favor, reescriba bajo una condición de bucle diferente...

Es decir, hay un maravilloso 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];

}

¿Es posible escribir un código similar a los resultados del anterior? Pero para un bucle:

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

Por segundo día que estoy sentado aquí; no puedo encontrarlo...

 
Hola a todos, por supuesto la pregunta es estúpida, ¿cuál es el tamaño del lote necesario para que 1 pip valga 1 dólar?
 
0.1
 
FEAR:
Hola a todos, por supuesto la pregunta es estúpida de cuánto tiene que ser un lote para que 1 pip valga 1 dólar.
Depende del tamaño del lote.
 
nikelodeon:
0.1
no siempre
 
PapaYozh:
no siempre
Según el hombro....
 
0,1 a 1:100 de apalancamiento
 
nikelodeon:
En función del hombro....

nikelodeon:
0,1 con un apalancamiento de 1:100

Los hombros son irrelevantes cuando se trata del estilo del artículo.