[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 439

 
Moi aussi, je me demande parfois pourquoi les développeurs, au lieu de toutes ces bêtises, ne pouvaient pas simplement créer deux boutons dans le terminal : "gagner" et "drainer". Les problèmes seraient réduits d'un ordre de grandeur.
 
Necron >>:

Добрый всем! В общем проблема следующего плана. Есть тс, по которой нужно открывать позицию тройным лотом, после чего каждый лот сопровождается отдельно(со своим TP, сигналом закрытия). Интересуют способы реализации. Мне на ум пришел такой способ: использовать три отложенника, запоминать их тикеты, а потом каждый отдельно выбирать и закрывать по своему условию. Есть ли какие-либо другие способы (или более удобные)?

PS. Поймите правильно, около месяца назад только своего первого советника на машках написал=)))))

définir un commentaire pour chaque ordre ("lot_1", "lot_2"....), reconnaître les ordres à partir du commentaire...

Si ce n'est pas clair, alors écrire plus de détails peut être décrit...

 
StatBars >>:

установите каждому ордеру свой коммент("lot_1","lot_2"....), по коменту распознавайте ордера...

Если не понятно то пишите подробнее можно будет описать...

Merci, StatBars ! C'est juste que j'ai déjà commencé à faire avec le choix du magicien. Votre option, je pense, ressemblerait à ceci ? (J'avoue m'être souvenu qu'il y en avait un similaire dans l'une des EA =)) Alors quelle est la meilleure option ?

if ( (OrderSymbol() == Symbol()) &&
(StringSubstr(OrderComment(),0,0) == "lot_1") )

 
Necron >>:

Спасибо, StatBars! Просто я уже начал делать с выбором по магику. Ваш вариант думаю так будет выглядеть? (признаюсь, вспомнил что в одном из советников было похожее =)) Тогда какой вариант наиболее оптимален?

if ( (OrderSymbol() == Symbol()) &&
(StringFind(OrderComment(),"lot_1") >= 0) )

Un peu corrigé.

J'utilise habituellement la magie et le symbole pour identifier les ordres de "mon" EA.

Je mets toutes les autres informations dans le commentaire.

Je ne dirais pas que c'est mieux, vous ne pouvez pas voir ce que vous ferez des commandes plus tard et si 3 autres commandes peuvent s'ouvrir.....

 
chief2000 >>:



Будет срабатывать на каждом тике пока выполняется условие. Небось код для тещи переделываете? :)





Un énorme MERCI ! Compilé tout fonctionne, bip à chaque tic.

Ma belle-mère n'est pas encore là, mais si quelque chose..., je vais prendre cette idée en compte)))

 

Désolé, il y a une question. Comment planter un client de manière programmatique.

Dans mes recherches sur la décompilation, j'ai rencontré l'ambiguïté de la décompilation. La question se pose maintenant de savoir comment l'utiliser.

Les choix sont de planter le système.

ou de suspendre le décompilateur.

 
StatBars >>:

Поправил немного.

Магик и символ обычно использую для идентификации "своих" ордеров эксперта.

Всю остальную информацию запихиваю в коммент.

Я бы не сказал что тут будет что-то оптимальнее, не видно же что Вы потом будуте делать с ордерами и может ли открыться ещё одна 3-ка ордеров....

Merci ! Corrigé dans l'Expert Advisor à votre variante. Je vais terminer ce miracle et le mettre en ligne sur Code Base comme ma première création (plus ou moins) sérieuse :) Le système par lequel j'écris l'Expert Advisor s'appelle Muteki, mais il est un peu avec mes ajouts (pour la gestion des positions). C'est bien qu'il y ait au moins un indicateur qui permette de dégager toutes ces tendances.)

Seulement, une autre question s'est posée. Comment puis-je ouvrir trois postes simultanément (ou environ un devis) ? Est-ce correct, ou existe-t-il d'autres moyens ? Je ne peux pas le faire avec les pendentifs=(( Une petite distance est parfois trop importante :(


if(b1==0 && !IsTradeContextBusy())
{
if(Low[0]<HHL_1 && Bid>=HHL_1 && trade_buy==true)
{
ticket=OrderSend(Symbol(),OP_BUY,lot,Ask,slippage*PointX,sl_b,BuyTarget1,"lot_1_buy",Magic,0,Lime);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("lot_1_buy order opened : ",OrderOpenPrice());
b1=1;
}
else Print("Error opening BUY order : ",GetLastError());

return(0);
}
}

 
// ищем самый последний закрытый ордер
for( i=OrdersHistoryTotal(); i>=0; i--){
  if(OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)){
    if(OrderSymbol()==Symbol()){
      if(OrderMagicNumber()==16384){
        if(OrderCloseTime()!=0){
          if(OrderCloseTime()> time){
          time=OrderCloseTime();
          profit=OrderProfit();
          
            //мартин
            if( profit<=0) Lots=OrderLots()*2;
            //----
            
            
          }
        }
      }
    }
  }
}
//-----

La fonction recherche le dernier lot fermé, s'il a fait une perte, son lot pour l'ouverture d'une nouvelle affaire sera multiplié par deux.

En pratique, chaque nouvelle affaire, qu'elle soit rentable ou non, est doublée en lot.


Question : qu'est-ce qui ne va pas ?

 
Summer:

Je me souviens d'une fonction que je refaisais. Voici le code. Lots (in ordersend) =getLots(), koeff= facteur d'incrémentation des lots (par défaut 2) Seulement jusqu'à dix lots (à partir de 0.1) j'ai obtenu dans mon test=))))

double getLots() {

double minlot = MarketInfo(Symbol(), MODE_MINLOT);
double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);
int round;
if(minlot==0.01)round=2;
if(minlot==0.1) round=1;
double koeff=2;
double result=Lots;

int total = OrdersHistoryTotal();
double spread = MarketInfo(Symbol(), MODE_SPREAD);

for (int i = 0; i < total; i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderProfit() > 0)
{
result = Lots;

} else {
result = OrderLots() * koeff;

}
}
}
result = NormalizeDouble(result, round);
if (result > maxlot) {
result = maxlot;
}
if (result < minlot) {
result = minlot;
}
RefreshRates();
return(result);
}

 

il y a une erreur dans la fonction, je ne la trouve pas, c'est soit avec ( ou avec {

J'ai joint le code.

Raison: