[Archive] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 2. - page 227

 
drknn:

Augmentez le glissement. Les transactions doivent avoir été ouvertes sur un marché rapide. Il arrive parfois après des nouvelles importantes que l'Eurobucks soit si rapide en 1-2 ticks que c'est un cauchemar. Et pendant que le serveur traite l'ordre de l'EA, le prix change très brusquement.


Je crains que si le slippage est toujours important, DT ne commence à en abuser de manière systématique. Il serait souhaitable de le "déplacer" dynamiquement - uniquement si le prix sur le serveur est meilleur que celui auquel l'ordre a été envoyé. Ce serait similaire à une enchère manuelle - si le prix demandé n'est plus disponible, un nouveau prix sera proposé, qui pourra être accepté en appuyant sur OK ou rejeté - s'il s'agit de la même situation, bien sûr.

 

Bonjour à tous ! Veuillez m'aider à combiner les éléments suivants. Le résultat devrait être : deux lignes suivant le prix, une inférieure à Ask de 20 pips..,

l'autre est plus élevé. De plus, je reçois un bip si le prix change de 20 points par 1 tick.

Tout fonctionne bien séparément. Merci d'avance !

1) La ligne en dessous du Ask de 20 pips.

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int start()
{
ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask-20*Point) ;
ObjectSet("MyPriceLine", OBJPROP_PRICE1, Ask-20*Point);
return(0);
}

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

2) La ligne est 20 pips au-dessus de l'Ask.

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int start()
{
ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask+20*Point) ;
ObjectSet("MyPriceLine", OBJPROP_PRICE1, Ask+20*Point);
return(0);
}

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

3) Le taux de variation des prix dans le temps.

#property show_inputs

extern int pips=2; //изменение аск
extern double Time_=0.1; //c. ~ tick
extern bool все_из_обзора_рынка=true; // только текущий символ - false

int i, l, p, количество_символов;
string val[], на_экран;
int Ask_save[];

//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
void start(){
количество_символов=SymbolsList(val, true);//запись в массив val инструменты и их количество вызов функции SymbolsList
ArrayResize(Ask_save,количество_символов);
if(количество_символов == -1){ Alert("Ошибка открытия файла в SymbolsList(string &Symbols[], bool Selected)"); return;}
if(!все_из_обзора_рынка){
количество_символов=1;
ArrayResize(Ask_save,количество_символов);
ArrayResize(val,количество_символов);
val[0]=Symbol();
}

while(true&&!IsStopped()){ //если разрешить и не отанавливать скрипт продолжим

Alert("пересчитаем через "+Time_+" сек.");

for(i=0;i<количество_символов;i++){//посчитаем стоимость спреда для инструментов из обзора рынка
if((Ask_save[i]-MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT))>=pips){
Alert(val[i]+","+Period()+" изменился вниз на "+DoubleToStr((Ask_save[i]-MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT)),0)+" pips");
PlaySound("timeout.wav");
}
if((MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT)-Ask_save[i])>=pips){
Alert(val[i]+","+Period()+" изменился вверх на "+DoubleToStr((MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT)-Ask_save[i]),0)+" pips");
PlaySound("email.wav");
}
Ask_save[i]=MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT);
}
Sleep(Time_*1000);//пауза сек.
}

/*
количество_символов=SymbolsList(val, true);//запись в массив val инструменты и их количество вызов функции SymbolsList
if(количество_символов == -1){ Alert("Ошибка открытия файла в SymbolsList(string &Symbols[], bool Selected)"); return;}

while(true&&!IsStopped()){ //если разрешить и не отанавливать скрипт продолжим
на_экран="\r\n"; //отступ
for(i=0;i<количество_символов;i++)//посчитаем стоимость спреда для инструментов из обзора рынка
на_экран=на_экран+val[i]+" стоимость спреда = " + DoubleToStr(MarketInfo(val[i],MODE_SPREAD)*MarketInfo(val[i],MODE_TICKVALUE),0)+"\r\n";
Comment(на_экран);//выведем на экран
Alert("Пересчитаем");//сигнал
Sleep(3000);//пауза 3 сек.
}
*/
}
void deinit(){Comment("");}
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=


//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// функция читает из обзора рынка все фин.инстр.
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
int SymbolsList(string &Symbols[], bool Selected){
int Offset, SymbolsNumber; string SymbolsFileName;
if(Selected) SymbolsFileName = "symbols.sel"; else SymbolsFileName = "symbols.raw";
int hFile = FileOpenHistory(SymbolsFileName, FILE_BIN|FILE_READ);
if(hFile < 0) return(-1); if(Selected) { SymbolsNumber = (FileSize(hFile) - 4) / 128; Offset = 116; }
else { SymbolsNumber = FileSize(hFile) / 1936; Offset = 1924; }
ArrayResize(Symbols, SymbolsNumber);
if(Selected) FileSeek(hFile, 4, SEEK_SET);
for(int i = 0; i < SymbolsNumber; i++){Symbols[i] = FileReadString(hFile, 12); FileSeek(hFile, Offset, SEEK_CUR);}
FileClose(hFile);
return(SymbolsNumber);
}
 
Vovo4ka:

Comme si un petrosien intelligent voulait faire une blague...))

Je suis désolé pour ça, l'argent est à vous. Plus vous êtes nombreux, mieux nous nous portons.
 
ScioMe:

MetaEditor dispose d'un indicateur iMA standard. N'hésitez pas à l'utiliser :)
S'il vous plaît, dites-moi où l'obtenir et où le mettre, je suis toujours un parfait imbécile...
 
Vovo4ka:
Les gens ! J'essaye de faire, qui échangerait beaucoup en fonction du risque .... ce qui ne sort pas .... écrit

Veuillez indiquer où se trouve l'erreur....

Vous n'avez qu'un seul ordre du bon type dans votre historique de transactions ?

if(OrderProfit()>0) break;

S'il y a un ordre qui a clôturé en profit - nous sortons de la boucle et ne vérifions pas le reste de l'historique...

int    orders=HistoryTotal();     // history orders tota l

C'est votre propre fonction ? Ou OrdersHistoryTotal()?

Je suis confus par la recherche du nombre d'ordres perdants. Si vous avez besoin de la dernière commande clôturée, où se trouve le chèque de la dernière commande ?

Voici le devoir à faire pour votre propre analyse :

int losses=0;
for (int i=0; i<OrdersHistoryTotal(); i++) {                // Цикл по истории терминала
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {         // Если ордер выбран ...
      if (OrderSymbol()!=Symbol())     continue;            // Если символ ордера не наш -  к следующему ордеру
      if (OrderType()>OP_SELL)         continue;            // Если тип ордера не наш -     к следующему ордеру
      if (OrderMagicNumber()!=Magic)   continue;            // Если магик ордера не наш -   к следующему ордеру
      if (OrderProfit()>=0)            continue;            // Если профит ордера в плюсе - к следующему ордеру
      if (OrderProfit()<0)                                  // Ордер закрыт в минусе ...
         losses++;                                          // Увеличиваем счётчик убыточных ордеров      
      }
   else if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {   // Если не удалось выбрать ордер ...
      Print("Error in history! ", GetLastError());          // Сообщим об ошибке и посмотрим её код
      break;                                                // Прерываем цикл перебора ордеров
      }
   }

Et encore une chose :

if(ldlot<0.1) ldlot=0.1;

Peut-on tout de même faire un chèque pour moins que le minimum admissible ?

double MinLot=MarketInfo(Symbol(),MODE_MINLOT);
if (ldlot<MinLot) ldlot=MinLot;

Et en même temps, est-il plus grand que le maximum (en passant la taille du lot à la fonction) ?

double MaxLot=MarketInfo(Symbol(),MODE_MAXLOT);
if (ldlot>MaxLot) ldlot=MaxLot;
 
doon:

Merci, mais tu devras quand même mettre un slip là-dedans.

Je ne comprends pas, pourquoi tu en as besoin là ? Je pense que c'est assez simple.
 
ZZZEROXXX:


Je crains que si le slippage est toujours élevé, le DC ne commence à en abuser de manière systématique.

Si le DC commence à en abuser, rien n'y fera. Voici une autre chose qui pourrait fonctionner. Si votre société de courtage a des spreads flottants, il est préférable d'utiliser la fonction de détermination automatique de la taille du spread et le slippage doit être fixé à trois spreads. Le glissement sera alors modifié de façon dynamique.
 
Dites-moi, si je travaille avec des commandes par ticket, comment écrire une variable (int Ticket), comme statique locale ou comme globale habituelle ou en général, comme locale habituelle ? Je suis confus. Merci.
 
Fam:
Si nous travaillons avec des commandes par ticket, comment écrire correctement la variable (int Ticket), comme une variable locale statique ou comme une variable globale régulière, ou généralement comme une variable locale régulière ? Je suis confus. Merci.

Tout dépend si cette variable sera disponible pour toutes les fonctions EA (enfin... pas toutes, mais certaines à coup sûr). Alors la variable est globale.

S'il n'est utilisé que dans une seule fonction, il est alors local.

La question est du genre "dans quelle eau mettre les fleurs, eau plate ou eau sucrée" ... en devinant, les fleurs sont devenues un balai, dans le bain... :))

 
ZZZEROXXX:


Je crains que si le slippage est toujours élevé, le DC n'en abuse de manière systématique. Je voudrais le "slipper" dynamiquement - seulement si le prix sur le serveur est meilleur que le prix auquel l'ordre a été envoyé. Ce serait similaire à une enchère manuelle - si le prix demandé n'est plus disponible, un nouveau prix sera proposé, qui pourra être accepté en appuyant sur OK ou rejeté - s'il s'agit de la même situation, bien sûr.

Essayez d'abord de faire dépendre le slippage de la volatilité. Dans un marché calme, elle sera minime, dans un marché rapide, elle s'étendra plus largement.