jeudi 12 février 2026

prix = [100,98,105,102,110,107,115,112,120,117].

 un trader effectue des operations d'achat et vendre d'une seule action sur une periode de 10 jours . Chque jour, le prix de action est donnee dans un tableaux. Contraintes: le trader ne peut effectuer qu'une seule operation par jour: soit acheter une action, soit en vendre une. Il ne peut pas achter et vendre le meme jour, le trader ne peut detenir qu'une seule action a la fois, le trader peut commencer par vendre une action (ce qui signifie qu'il commence par une position courte), chaque fois qu'il change de position (c'est a dire qu'apres avoir achete il vend, ou apres avoir vendu il achete) il doit payer une commission fixe de 2 unites monetaires, l'objectif est de maximiser le gain total net (c'est a dire la somme des profits et pertes realises sur les operations, apres deduction des commissions. Donnees: un tableau prix de taille 10 contenant les prix de l'action pour chauqe jour: prix = [100,98,105,102,110,107,115,112,120,117]. Objectif: en c#, ecrire un algorithme qui, a partir du tableau des prix, determiner la strategie d'achat/vente (une seule operation par jour) permettant de maximiser le gain total net sur 10 jours)


===============


Ý tưởng (rất gọn)

Mỗi ngày chỉ cần giữ 3 giá trị tốt nhất:

  • flat: đang không giữ vị thế (lời/lỗ đã “chốt” hết)

  • longPos: đang giữ LONG (đã mua 1 cổ)

  • shortPos: đang giữ SHORT (đã bán khống 1 cổ)

Mỗi ngày ta có thể:

  • mở long từ flat: flat - price

  • đóng long về flat: longPos + price - fee

  • mở short từ flat: flat + price

  • đóng short về flat: shortPos - price - fee

Phí fee=2 được trừ khi đóng vị thế (tức là khi đổi trạng thái từ long/short về flat).
Kết quả cần “lợi nhuận thực hiện” ⇒ lấy flat ở ngày cuối.


=======================

using System;


class Program

{

    static void Main()

    {

        int[] prices = { 100, 98, 105, 102, 110, 107, 115, 112, 120, 117 };

        int fee = 2;


        int flat = 0;

        int longPos = -prices[0];   // mua ngày 1

        int shortPos = prices[0];   // bán khống ngày 1


        for (int i = 1; i < prices.Length; i++)

        {

            int p = prices[i];


            int newFlat = flat;

            newFlat = Math.Max(newFlat, longPos + p - fee);   // đóng long

            newFlat = Math.Max(newFlat, shortPos - p - fee);  // đóng short


            int newLong = Math.Max(longPos, flat - p);        // mở long

            int newShort = Math.Max(shortPos, flat + p);      // mở short


            flat = newFlat;

            longPos = newLong;

            shortPos = newShort;

        }


        Console.WriteLine(flat); // max profit net, kết thúc flat

    }

}


Aucun commentaire:

Enregistrer un commentaire